我选用了三台服务器,一台做master,两台做slave(slave1,slave2)
- 更改hostname
 
#在master节点上,同理在另外两个slave上更改hostname
hostnamectl set-hostname master
- 卸载旧版本的docker
 
- # 在 master 节点和 slave 节点都执行
 - yum remove -y docker \
 - docker-client \
 - docker-client-latest \
 - docker-common \
 - docker-latest \
 - docker-latest-logrotate \
 - docker-logrotate \
 - docker-selinux \
 - docker-engine-selinux \
 - docker-engine
 
- 设置yum respository
 
- # 在 master 节点和 slave节点都执行
 - yum install -y yum-utils \
 - device-mapper-persistent-data \
 - lvm2
 - sudo yum-config-manager \
 - --add-repo \
 
- 安装并启动docker(若遇到下载较慢,则把那个较慢的文件下载下来手动安装)
 
- # 在 master 节点和 slave节点都执行
 - yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 con
 - systemctl enable docker
 - systemctl start docker
 
- 检查docker版本
 
- # 在 master 节点和 slave节点都执行
 - docker version
 
- 安装nfs-utils
 
- # 在 master 节点和 slave节点都执行
 - yum install -y nfs-utils
 
- 配置k8s的yum源
 
- # 在 master 节点和 slave节点都执行
 - cat <<EOF > /etc
 - [kubernetes]
 - name=Kubernetes
 - baseurl=
 - enabled=1
 - gpgcheck=0
 - repo_gpgcheck=0
 - gpgkey=
 - EOF
 
- 关闭防火墙、SeLinux、swap
 
- # 在 master 节点和 slave节点都要执行
 - systemctl stop firewalld
 - systemctl disable firewalld
 - setenforce 0
 - sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
 - swapoff -a
 - yes | cp /etc/fstab /etc/fstab_bak
 - cat /etc/fstab_bak |grep -v swap > /etc/fstab
 
- 修改 /etc
 
- # 在 master 节点和 slave节点都要执行
 - vim /etc
 
向其中添加
- net.i = 1
 - net.bridge.bridge-nf-call-ip6tables = 1
 - net.bridge.bridge-nf-call-iptables = 1
 
执行命令使添加生效
- # 在 master 节点和 slave节点都要执行
 - sysctl -p
 
- 安装kubelet、 kubeadm、 kubectl
 
- # 在 master 节点和 slave 节点都要执行
 - yum install -y kubele kubeadm-1.21.1 kubec
 
- 修改/usr/lib/systemd/system
 
- # 在 master 节点和 slave 节点都要执行
 - vim /usr/lib/systemd/system
 
向其中添加
- --exec-opt na
 
添加位置参考下图
- 执行以下命令使用 docker 国内镜像,提高 docker 镜像下载速度和稳定性
 
- # 在 master 节点和 slave节点都要执行
 - Curl -sSL | sh -s
 
- 重启docker, 并启动kubectl
 
- # 在 master 节点和 slave节点都要执行
 - systemctl daemon-reload
 - systemctl restart docker
 - systemctl enable kubelet && systemctl start kubelet
 
- 配置 master 的域名
 
- # 只在 master 节点执行
 - echo "x.x.x.x master" >> /etc/hosts
 
- 创建 .
 
- # 只在 master 节点执行
 - cat <<EOF > .
 - apiVersion: kubeadm.k8s.io/v1beta1
 - kind: ClusterConfiguration
 - kubernetesVersion: v1.21.1
 - imageRepository: regi
 - controlPlaneEndpoint: "master:6443"
 - networking:
 - podSubnet: "10.100.0.1/20"
 - EOF
 
注意podSubnet所使用的网段不能与节点所在的网段重叠
- 初始化 master
 
- # 只在 master 节点执行
 - kubeadm init --config=kubeadm-con --upload-certs
 
根据自身服务器情况等待几分钟,执行成功结果如图:
- 初始化 root 用户的 kubectl 配置
 
- # 只在 master 节点执行
 - rm -rf /root/.kube/
 - mkdir /root/.kube/
 - cp -i /etc/kubernete /root/.kube/config
 
- 安装calico网络插件
 
- # 只在 master 节点执行
 - kubectl apply -f
 
- 执行以下命令,等待3-10分钟,直到所有的容器储与Running状态
 
- # 只在 master 节点执行
 - watch kubectl get pod -n kube-system
 
- 检查 master 初始化结果
 
- # 只在 master 节点执行
 - kubectl get nodes
 
- 获得join参数
 
- # 只在 master 节点执行
 - kubeadm token create --print-join-command
 
输入以上命令获得的结果如下
- # kubeadm token create 命令的输出
 - kubeadm join master:6443 --token m --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
 
- 针对所有的 slave 节点执行
 
- # 只在 slave 节点执行
 - echo "x.x.x.x master" >> /etc/hosts
 - kubeadm join a --token m --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
 
需要将x.x.x.x替换为master节点的IP,下面一行命令为“获得join”参数后的输出
- 检查初始化结果
 
- # 只在 master 节点执行
 - kubectl get nodes
 
- 到此 kubernetes 集群已全部安装完毕,下面为slave节点出错使一出slave节点的方法(将这两步执行后,可再次回到加入的阶段进行)
 - 1.在准备移除的 slave 节点上执行
 
- # 只在 slave 节点执行
 - kubeadm reset
 
- 2.在 master 节点上执行
 
# 只在 master 节点执行
kubectl delete node demo-slave-x-x
k8s集群监控软件Kuboard的安装
- 安装kuboard
 
- # 在 master 节点执行
 - kubectl apply -f
 
- 查看kuboard状态
 
- # 在 master 节点执行
 - kubectl get pods -l k8s.eip.work/name=kuboard -n kube-system
 
输出结果如下:
- NAME READY STATUS RESTARTS AGE
 - kuboard-54c9c4f6cb-6lf88 1/1 Running 0 45s
 
- 获取管理员用户的token
 
- # 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令
 - kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')
 
输出示例:
- Name: admin-user-token-g8hxb
 - Namespace: kube-system
 - Labels: <none>
 - Annotations: [kuberne](http://kuberne): Kuboard-user
 - [kuberne](http://kuberne): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f
 - Type: [kuberne](http://kuberne)
 - Data
 - ====
 - ca.crt: 1025 bytes
 - namespace: 11 bytes
 - token: eyJ
 
- 访问kuboard,默认端口为32567
 
- http://任意一个slave节点的IP地址:32567/
 
以下为获取只读用户以及其它访问方式的附属文档
- 获取只读用户token
 
- # 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令
 - kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}')
 
只读用户拥有的权限:
(1):view 可查看名称空间的内容
(2):system:node 可查看节点信息
(3):system:persistent-volume-provisioner 可查看存储类和存储卷声明的信息
适用场景:
只读用户不能对集群的配置执行修改操作,非常适用于将开发环境中的 Kuboard 只读权限分发给开发者,以便开发者可以便捷地诊断问题
- 通过port-forward访问kuboard
 
- # 在 master 节点执行
 - kubectl port-forward service/kuboard 8080:80 -n kube-system
 
在浏览器打开连接
三、Helm的安装
- 访问 下载合适的helm版本,此处下载的为
 - 解压文件
 
- # 在master节点执行
 - tar -zxvf
 
- 将解压后的helm移动到/usr/local/bin目录下:
 
- # 在master节点执行
 - mv linux-amd64/helm /usr/local/bin/helm
 
- 安装socat(否则可能会报如下错误:Error: cannot connect to Tiller)
 
- # 在master和slave节点执行
 - yum install -y socat
 
- 创建一个名为tiller的Service Account
 
- # 在 master 节点执行
 - kubectl create serviceaccount tiller --namespace kube-system
 
- 授予名未tiller的Service Account集群管理员角色cluster-admin,首先创建名为rbac-con
 
- apiVersion: rbac.au
 - kind: ClusterRoleBinding
 - metadata:
 - name: tiller
 - roleRef:
 - apiGroup: rbac.au
 - kind: ClusterRole
 - name: cluster-admin
 - subjects:
 - - kind: ServiceAccount
 - name: tiller
 - namespace: kube-system
 
- 绑定授予tiller集群管理员
 
- # 在 master 节点执行
 - kubectl create -f rbac-con
 
- 安装Tiller服务器
 
- # 在 master 节点执行
 - helm init --service-account tiller
 
- 验证安装
 
- # 在 master 节点执行
 - helm version
 
若正确显示Helm客户端和Tiller服务器的版本,表示安装成功
若出现 cannot connect to Tiller 或者 could not find a ready tiller pod 的问题,输入以下命令:
- # 在 master 节点执行
 - helm init -i sapcc/tiller:v2.16.1 --upgrade
 
- 设置添加tiller账户
 
- # 在 master 节点执行
 - kubectl --namespace kube-system patch deploy tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
 
四、nfs服务的安装配置
- 在所有节点安装nfs
 
- # 在 master 和 slave 节点执行
 - yum install -y nfs-common nfs-utils
 
- 创建共享目录
 
- # 在 master 节点执行
 - mkdir /nfsdata
 
- 授权共享目录
 
- # 在 master 节点执行
 - chmod 666 /nfsdata
 
- 编辑nfs的配置文件:/etc/exports
 
- # 在 master 节点执行
 - vim /etc/exports
 - /nfsdata *(rw,no_root_squash,no_all_squash,sync)
 
说明:
/nfsdata:是共享数据的目录。
*:表示任何人都有权限连接。
rw:读写的权限
sync:表示文件同时写入硬盘和内存
no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份
- 启动rpc 和 nfs(注意启动的顺序)
 
- # 在 master 节点执行
 - #先启动rpc
 - systemctl start r
 - systemctl enable rpcbind
 - systemctl status rpcbind
 - # 再启动nfs
 - systemctl start n
 - systemctl enable nfs
 - systemctl status nfs
 
- 确认nfs安装成功
 
- # 在 master 节点执行
 - rpcinfo -p|grep nfs
 
输出示例:
- 100003 3 tcp 2049 nfs
 - 100003 4 tcp 2049 nfs
 - 100227 3 tcp 2049 nfs_acl
 - 100003 3 udp 2049 nfs
 - 100003 4 udp 2049 nfs
 - 100227 3 udp 2049 nfs_acl
 
- 查看目录的挂载权限
 
- # 在 master 节点执行
 - cat /var/lib/nfs/etab
 
输出示例:
- /data/k8s *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,no_root_squash,no_all_squash)
 
jupyterhub 的安装
Jupyterhub 安装方法:
第一种:helm安装
- 生成随机安全令牌
 
- # 在 master 节点执行
 - openssl rand -hex 32
 
- 编辑 con 文件
 
- proxy:
 - secretToken: "xxxxxxxxxxxxxxx"
 
- helm更新安装jupyterhub的chart repository
 
- # 在 master 节点执行
 - helm repo add jupyterhub
 - helm repo update
 
输出示例:
- Hang tight while we grab the latest from your chart repositories...
 - ...Skip local chart repository
 - ...Successfully got an update from the "stable" chart repository
 - ...Successfully got an update from the "jupyterhub" chart repository
 - Update Complete.
 
- 安装chart configured
 
- helm upgrade --cleanup-on-fail \
 - --install $RELEASE jupyterhub/jupyterhub \
 - --namespace $NAMESPACE \
 - --create-namespace \
 - --version=0.11.1 \
 - --values con
 
注意直接执行即可无需改动
注意下面步骤非常重要
- 在执行上面命令后会发现界面卡在如下所示不动,
 
- 此时打开另一个 master 窗口,查看pod
 
- # 在master节点执行
 - kubectl get pod --namespace jhub
 
发现报 ErrImagePull 错,如下图所示(多查看几次,若还是错误就进行修改,如正确就不用在进行修改):
- 此时通过如下命令修改这个pod
 
- # 在 master 节点执行
 - kubectl edit pod hook-image-puller-p9j9b -n jhub
 
将该文件中的 gcr.io 全部替换为 gcr.azk8s.cn ,再保存退出
- 稍等一会,在原窗口可以看到如下界面:
 
- 此时再次查看 jhub 命名空间的pod
 
- # 在 master 节点执行
 - kubectl get pod --namespace jhub
 
出现如下这表示成功:
- 查看service
 
# 在 master 节点执行
kubectl get service --namespace jhub
此时发现 proxy-public 的 EXTERNAL-IP 处于pending状态
- 修改proxy-public
 
- # 在 master 节点执行
 - kubectl edit service proxy-public -n jhub
 
将 type: LoadBalancer 改成 type: NodePort
- 再次查看 service
 
此时我们在浏览器中通过 80 映射的端口去访问jupyterhub
- 此时由于jupyterhub是默认设置任何用户均可登陆
 
- 到此,基于k8s的jupyterhub已经基本搭建完成。
 
第二种:conda安装
Conda安装,首先要安装Anaconda
JupyterHub是基于Python的,所以我们需要安装一下Python的相关环境。Anaconda是一个非常成熟的Python包管理工具,因此本文档选用该工具进行基础环境的安装,首先就是安装该工具。
- 下载---这里我使用清华的镜像站点下载,速度很nice,50-60MB/s
 
wget
- 安装
 
bash Anaconda2-2018.12-Linux-x86_64.sh
根据提示安装即可,安装过程中会询问你是否将anaconda的路径加入到环境变量.bashrc中,默认是no,所以如果在安装的过程中手太快,一键到底了的话,可以通过手动添加的方式进行设置。
- 手动添加方式:
 
vim ~/.bashrc
在bashrc文件的最后添加
- # added by Anaconda3 2018.12 installer
 - # >>> conda init >>>
 - # !! Contents within this block are managed by 'conda init' !!
 - __conda_setup="$(CONDA_REPORT_ERRORS=false '/opt/anaconda3/bin/conda' hook 3> /dev/null)"
 - if [ $? -eq 0 ]; then
 - \eval "$__conda_setup"
 - else
 - if [ -f "/opt/anaconda3/etc; ]; then
 - . "/opt/anaconda3/etc;
 - CONDA_CHANGEPS1=false conda activate base
 - else
 - \export PATH="/opt/anaconda3/bin:$PATH"
 - fi
 - fi
 - unset __conda_setup
 - # <<< conda init <<<
 
保存并退出
然后
source ~/.bashrc
检测Anaconda是否安装成功:
conda list
如果提示conda: command not found,请参考是否将Anaconda3加入环境变量,并且更新生效。
- 安装jupyterhub
 - 可以使用清华的conda源加速
 
- conda config --add channels
 - conda config --add channels
 - conda config --add channels
 - conda config --set show_channel_urls yes
 
conda install -c conda-forge jupyterhub
- 检测安装是否成功
 
- jupyterhub -h
 - npm install -g configurable-http-proxy
 - configurable-http-proxy -h
 
- 生成配置文件
 
- c.Ju = '您的IP'
 - c.Ju = 您的端口
 - c.S = '127.0.0.1'
 - c.PAMAu = 'utf8'
 - c.Au = {'root','admin'} #默认不能使用root登录,需要修改配置
 - c.LocalAu = True
 - c.Au = {'root', 'admin'}
 - c.Ju = 'dummyau;
 - c.Ju = 'jupyterhub'
 - c.S = '/volume1/' #jupyterhub自定义目录
 - c.S = =['jupyterhub-singleuser']
 
第三种:pip安装
- 更新pip版本
 
python3 -m pip install --upgrade pip
- 安装npm和nodejs
 
- apt-get update
 - # 更新
 - sudo apt-get install npm
 - # 安装npm
 - sudo npm install n -g
 - # 安装n模块
 - sudo n lts
 - # 安装最新长期支持版 node。不要低于版本12
 
- 安装jupyterhub
 
- sudo npm install -g configurable-http-proxy
 - sudo python3 -m pip install jupyterhub
 
- 生成ju配置文件
 
- jupyterhub --generate-config -f 【PATH】
 - # 将【PATH】替换为对应的文件位置。若不指定PATH,则默认为当前文件夹
 
- 配置ju文件
 
- c.Ju = '您的IP'
 - c.Ju = 您的端口
 - c.S = '127.0.0.1'
 - c.PAMAu = 'utf8'
 - c.Au = {'root','admin'} #默认不能使用root登录,需要修改配置
 - c.LocalAu = True
 - c.Au = {'root', 'admin'}
 - c.Ju = 'dummyau;
 - c.Ju = 'jupyterhub'
 - c.S = '/volume1/study/' #jupyterhub自定义目录
 - c.S = =['jupyterhub-singleuser']
 
默认情况下,密码为系统中该用户对应的密码
安装Dashboard插件
Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上。
- 安装
 
wget
安装之后会生成一个kuberne文件
- kind: ServiceapiVersion: v1metadata:
 - labels:
 - k8s-app: kubernetes-dashboard
 - name: kubernetes-dashboard
 - namespace: kube-systemspec:
 - ports:
 - - port: 443
 - targetPort: 8443
 - type: NodePort
 - selector:
 - k8s-app: kubernetes-dashboard
 
- 然后直接部署新版本的dashboard即可:
 
kubectl create -f kuberne
- 查看 dashboard 的外网访问端口:
 
kubectl get svc kubernetes-dashboard -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
haproxy ClusterIP 10.254.125.90 <none> 8440/TCP,8442/TCP 2d
kubernetes-dashboard NodePort 10.254.122.185 <none> 443:31694/TCP 10s
然后直接访问集群中的任何一个节点 IP 加上上面的31694端口即可打开 dashboard 页面了.
由于 dashboard 默认是自建的 https 证书,该证书是不受浏览器信任的,所以我们需要强制跳转就可以了。
默认 dashboard 会跳转到登录页面,我们可以看到 dashboard 提供了Kubeconfig和token两种登录方式,我们可以直接跳过或者使用本地的Kubeconfig文件进行登录,可以看到会跳转到如下页面:
这是由于该用户没有对default命名空间的访问权限。
- 生成token
 
登录 dashboard 的时候支持 Kubeconfig 和token 两种认证方式,Kubeconfig 中也依赖token 字段,所以生成token 这一步是必不可少的。
我们创建一个admin用户并授予admin 角色绑定,使用下面的yaml文件创建admin用户并赋予他管理员权限,然后就可以通过token 登陆dashbaord,这种认证方式本质实际上是通过Service Account 的身份认证加上Bearer token请求 API server 的方式实现。
- kind: ClusterRoleBinding
 - apiVersion: rbac.au
 - metadata:
 - name: admin
 - annotations:
 - rbac.au: "true"
 - roleRef:
 - kind: ClusterRole
 - name: cluster-admin
 - apiGroup: rbac.au
 - subjects:
 - - kind: ServiceAccount
 - name: admin
 - namespace: kube-system
 - ---
 - apiVersion: v1
 - kind: ServiceAccount
 - metadata:
 - name: admin
 - namespace: kube-system
 - labels:
 - kuberne: "true"
 - addonmanager.kuberne: Reconcile
 
上面的admin用户创建完成后我们就可以获取到该用户对应的token了,如下命令:
$ kubectl get secret -n kube-system|grep admin-token
admin-token-d5jsg kuberne 3 1d
$ kubectl get secret admin-token-d5jsg -o jsonpath={.da} -n kube-system |base64 -d# 会生成一串很长的base64后的字符串
然后在 dashboard 登录页面上直接使用上面得到的 token 字符串即可登录,这样就可以拥有管理员权限操作整个 kubernetes 集群的对象,当然你也可以为你的登录用户新建一个指定操作权限的用户。
下一节会更新一些常见的错误及处理办法,欢迎大家与我一起交流学习
1.《kubernetes集群搭建》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《kubernetes集群搭建》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/2282370.html