我选用了三台服务器,一台做master,两台做slave(slave1,slave2)

  • 更改hostname

#在master节点上,同理在另外两个slave上更改hostname

hostnamectl set-hostname master

  • 卸载旧版本的docker
  1. # 在 master 节点和 slave 节点都执行
  2. yum remove -y docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-selinux \
  10. docker-engine-selinux \
  11. docker-engine
  • 设置yum respository
  1. # 在 master 节点和 slave节点都执行
  2. yum install -y yum-utils \
  3. device-mapper-persistent-data \
  4. lvm2
  5. sudo yum-config-manager \
  6. --add-repo \
  • 安装并启动docker(若遇到下载较慢,则把那个较慢的文件下载下来手动安装)
  1. # 在 master 节点和 slave节点都执行
  2. yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 con
  3. systemctl enable docker
  4. systemctl start docker
  • 检查docker版本
  1. # 在 master 节点和 slave节点都执行
  2. docker version
  • 安装nfs-utils
  1. # 在 master 节点和 slave节点都执行
  2. yum install -y nfs-utils
  • 配置k8s的yum源
  1. # 在 master 节点和 slave节点都执行
  2. cat <<EOF > /etc
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=
  6. enabled=1
  7. gpgcheck=0
  8. repo_gpgcheck=0
  9. gpgkey=
  10. EOF
  • 关闭防火墙、SeLinux、swap
  1. # 在 master 节点和 slave节点都要执行
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. setenforce 0
  5. sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  6. swapoff -a
  7. yes | cp /etc/fstab /etc/fstab_bak
  8. cat /etc/fstab_bak |grep -v swap > /etc/fstab
  • 修改 /etc
  1. # 在 master 节点和 slave节点都要执行
  2. vim /etc

向其中添加

  1. net.i = 1
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1

执行命令使添加生效

  1. # 在 master 节点和 slave节点都要执行
  2. sysctl -p
  • 安装kubelet、 kubeadm、 kubectl
  1. # 在 master 节点和 slave 节点都要执行
  2. yum install -y kubele kubeadm-1.21.1 kubec
  • 修改/usr/lib/systemd/system
  1. # 在 master 节点和 slave 节点都要执行
  2. vim /usr/lib/systemd/system

向其中添加

  1. --exec-opt na

添加位置参考下图

  • 执行以下命令使用 docker 国内镜像,提高 docker 镜像下载速度和稳定性
  1. # 在 master 节点和 slave节点都要执行
  2. Curl -sSL | sh -s
  • 重启docker, 并启动kubectl
  1. # 在 master 节点和 slave节点都要执行
  2. systemctl daemon-reload
  3. systemctl restart docker
  4. systemctl enable kubelet && systemctl start kubelet
  • 配置 master 的域名
  1. # 只在 master 节点执行
  2. echo "x.x.x.x master" >> /etc/hosts
  • 创建 .
  1. # 只在 master 节点执行
  2. cat <<EOF > .
  3. apiVersion: kubeadm.k8s.io/v1beta1
  4. kind: ClusterConfiguration
  5. kubernetesVersion: v1.21.1
  6. imageRepository: regi
  7. controlPlaneEndpoint: "master:6443"
  8. networking:
  9. podSubnet: "10.100.0.1/20"
  10. EOF

注意podSubnet所使用的网段不能与节点所在的网段重叠

  • 初始化 master
  1. # 只在 master 节点执行
  2. kubeadm init --config=kubeadm-con --upload-certs

根据自身服务器情况等待几分钟,执行成功结果如图:

  • 初始化 root 用户的 kubectl 配置
  1. # 只在 master 节点执行
  2. rm -rf /root/.kube/
  3. mkdir /root/.kube/
  4. cp -i /etc/kubernete /root/.kube/config
  • 安装calico网络插件
  1. # 只在 master 节点执行
  2. kubectl apply -f
  • 执行以下命令,等待3-10分钟,直到所有的容器储与Running状态
  1. # 只在 master 节点执行
  2. watch kubectl get pod -n kube-system
  • 检查 master 初始化结果
  1. # 只在 master 节点执行
  2. kubectl get nodes
  • 获得join参数
  1. # 只在 master 节点执行
  2. kubeadm token create --print-join-command

输入以上命令获得的结果如下

  1. # kubeadm token create 命令的输出
  2. kubeadm join master:6443 --token m --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
  • 针对所有的 slave 节点执行
  1. # 只在 slave 节点执行
  2. echo "x.x.x.x master" >> /etc/hosts
  3. kubeadm join a --token m --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

需要将x.x.x.x替换为master节点的IP,下面一行命令为“获得join”参数后的输出

  • 检查初始化结果
  1. # 只在 master 节点执行
  2. kubectl get nodes
  • 到此 kubernetes 集群已全部安装完毕,下面为slave节点出错使一出slave节点的方法(将这两步执行后,可再次回到加入的阶段进行)
  • 1.在准备移除的 slave 节点上执行
  1. # 只在 slave 节点执行
  2. kubeadm reset
  • 2.在 master 节点上执行

# 只在 master 节点执行

kubectl delete node demo-slave-x-x

k8s集群监控软件Kuboard的安装

  • 安装kuboard
  1. # 在 master 节点执行
  2. kubectl apply -f
  • 查看kuboard状态
  1. # 在 master 节点执行
  2. kubectl get pods -l k8s.eip.work/name=kuboard -n kube-system

输出结果如下:

  1. NAME READY STATUS RESTARTS AGE
  2. kuboard-54c9c4f6cb-6lf88 1/1 Running 0 45s
  • 获取管理员用户的token
  1. # 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令
  2. kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')

输出示例:

  1. Name: admin-user-token-g8hxb
  2. Namespace: kube-system
  3. Labels: <none>
  4. Annotations: [kuberne](http://kuberne): Kuboard-user
  5. [kuberne](http://kuberne): 948bb5e6-8cdc-11e9-b67e-fa163e5f7a0f
  6. Type: [kuberne](http://kuberne)
  7. Data
  8. ====
  9. ca.crt: 1025 bytes
  10. namespace: 11 bytes
  11. token: eyJ
  • 访问kuboard,默认端口为32567
  1. http://任意一个slave节点的IP地址:32567/

以下为获取只读用户以及其它访问方式的附属文档

  • 获取只读用户token
  1. # 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令
  2. 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
  1. # 在 master 节点执行
  2. kubectl port-forward service/kuboard 8080:80 -n kube-system

在浏览器打开连接

三、Helm的安装

  • 访问 下载合适的helm版本,此处下载的为
  • 解压文件
  1. # 在master节点执行
  2. tar -zxvf
  • 将解压后的helm移动到/usr/local/bin目录下:
  1. # 在master节点执行
  2. mv linux-amd64/helm /usr/local/bin/helm
  • 安装socat(否则可能会报如下错误:Error: cannot connect to Tiller)
  1. # 在master和slave节点执行
  2. yum install -y socat
  • 创建一个名为tiller的Service Account
  1. # 在 master 节点执行
  2. kubectl create serviceaccount tiller --namespace kube-system
  • 授予名未tiller的Service Account集群管理员角色cluster-admin,首先创建名为rbac-con
  1. apiVersion: rbac.au
  2. kind: ClusterRoleBinding
  3. metadata:
  4. name: tiller
  5. roleRef:
  6. apiGroup: rbac.au
  7. kind: ClusterRole
  8. name: cluster-admin
  9. subjects:
  10. - kind: ServiceAccount
  11. name: tiller
  12. namespace: kube-system
  • 绑定授予tiller集群管理员
  1. # 在 master 节点执行
  2. kubectl create -f rbac-con
  • 安装Tiller服务器
  1. # 在 master 节点执行
  2. helm init --service-account tiller
  • 验证安装
  1. # 在 master 节点执行
  2. helm version

若正确显示Helm客户端和Tiller服务器的版本,表示安装成功

若出现 cannot connect to Tiller 或者 could not find a ready tiller pod 的问题,输入以下命令:

  1. # 在 master 节点执行
  2. helm init -i sapcc/tiller:v2.16.1 --upgrade
  • 设置添加tiller账户
  1. # 在 master 节点执行
  2. kubectl --namespace kube-system patch deploy tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

四、nfs服务的安装配置

  • 在所有节点安装nfs
  1. # 在 master 和 slave 节点执行
  2. yum install -y nfs-common nfs-utils
  • 创建共享目录
  1. # 在 master 节点执行
  2. mkdir /nfsdata
  • 授权共享目录
  1. # 在 master 节点执行
  2. chmod 666 /nfsdata
  • 编辑nfs的配置文件:/etc/exports
  1. # 在 master 节点执行
  2. vim /etc/exports
  3. /nfsdata *(rw,no_root_squash,no_all_squash,sync)

说明:

/nfsdata:是共享数据的目录。

*:表示任何人都有权限连接。

rw:读写的权限

sync:表示文件同时写入硬盘和内存

no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

  • 启动rpc 和 nfs(注意启动的顺序)
  1. # 在 master 节点执行
  2. #先启动rpc
  3. systemctl start r
  4. systemctl enable rpcbind
  5. systemctl status rpcbind
  6. # 再启动nfs
  7. systemctl start n
  8. systemctl enable nfs
  9. systemctl status nfs
  • 确认nfs安装成功
  1. # 在 master 节点执行
  2. rpcinfo -p|grep nfs

输出示例:

  1. 100003 3 tcp 2049 nfs
  2. 100003 4 tcp 2049 nfs
  3. 100227 3 tcp 2049 nfs_acl
  4. 100003 3 udp 2049 nfs
  5. 100003 4 udp 2049 nfs
  6. 100227 3 udp 2049 nfs_acl
  • 查看目录的挂载权限
  1. # 在 master 节点执行
  2. cat /var/lib/nfs/etab

输出示例:

  1. /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安装

  • 生成随机安全令牌
  1. # 在 master 节点执行
  2. openssl rand -hex 32
  • 编辑 con 文件
  1. proxy:
  2. secretToken: "xxxxxxxxxxxxxxx"
  • helm更新安装jupyterhub的chart repository
  1. # 在 master 节点执行
  2. helm repo add jupyterhub
  3. helm repo update

输出示例:

  1. Hang tight while we grab the latest from your chart repositories...
  2. ...Skip local chart repository
  3. ...Successfully got an update from the "stable" chart repository
  4. ...Successfully got an update from the "jupyterhub" chart repository
  5. Update Complete.
  • 安装chart configured
  1. helm upgrade --cleanup-on-fail \
  2. --install $RELEASE jupyterhub/jupyterhub \
  3. --namespace $NAMESPACE \
  4. --create-namespace \
  5. --version=0.11.1 \
  6. --values con

注意直接执行即可无需改动

注意下面步骤非常重要

  • 在执行上面命令后会发现界面卡在如下所示不动,
  • 此时打开另一个 master 窗口,查看pod
  1. # 在master节点执行
  2. kubectl get pod --namespace jhub

发现报 ErrImagePull 错,如下图所示(多查看几次,若还是错误就进行修改,如正确就不用在进行修改):

  • 此时通过如下命令修改这个pod
  1. # 在 master 节点执行
  2. kubectl edit pod hook-image-puller-p9j9b -n jhub

将该文件中的 gcr.io 全部替换为 gcr.azk8s.cn ,再保存退出

  • 稍等一会,在原窗口可以看到如下界面:
  • 此时再次查看 jhub 命名空间的pod
  1. # 在 master 节点执行
  2. kubectl get pod --namespace jhub

出现如下这表示成功:

  • 查看service

# 在 master 节点执行

kubectl get service --namespace jhub

此时发现 proxy-public 的 EXTERNAL-IP 处于pending状态

  • 修改proxy-public
  1. # 在 master 节点执行
  2. 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文件的最后添加

  1. # added by Anaconda3 2018.12 installer
  2. # >>> conda init >>>
  3. # !! Contents within this block are managed by 'conda init' !!
  4. __conda_setup="$(CONDA_REPORT_ERRORS=false '/opt/anaconda3/bin/conda' hook 3> /dev/null)"
  5. if [ $? -eq 0 ]; then
  6. \eval "$__conda_setup"
  7. else
  8. if [ -f "/opt/anaconda3/etc; ]; then
  9. . "/opt/anaconda3/etc;
  10. CONDA_CHANGEPS1=false conda activate base
  11. else
  12. \export PATH="/opt/anaconda3/bin:$PATH"
  13. fi
  14. fi
  15. unset __conda_setup
  16. # <<< conda init <<<

保存并退出
然后

source ~/.bashrc

检测Anaconda是否安装成功:

conda list

如果提示conda: command not found,请参考是否将Anaconda3加入环境变量,并且更新生效。

  • 安装jupyterhub
  • 可以使用清华的conda源加速
  1. conda config --add channels
  2. conda config --add channels
  3. conda config --add channels
  4. conda config --set show_channel_urls yes

conda install -c conda-forge jupyterhub

  • 检测安装是否成功
  1. jupyterhub -h
  2. npm install -g configurable-http-proxy
  3. configurable-http-proxy -h
  • 生成配置文件
  1. c.Ju = '您的IP'
  2. c.Ju = 您的端口
  3. c.S = '127.0.0.1'
  4. c.PAMAu = 'utf8'
  5. c.Au = {'root','admin'} #默认不能使用root登录,需要修改配置
  6. c.LocalAu = True
  7. c.Au = {'root', 'admin'}
  8. c.Ju = 'dummyau;
  9. c.Ju = 'jupyterhub'
  10. c.S = '/volume1/' #jupyterhub自定义目录
  11. c.S = =['jupyterhub-singleuser']

第三种:pip安装

  • 更新pip版本

python3 -m pip install --upgrade pip

  • 安装npm和nodejs
  1. apt-get update
  2. # 更新
  3. sudo apt-get install npm
  4. # 安装npm
  5. sudo npm install n -g
  6. # 安装n模块
  7. sudo n lts
  8. # 安装最新长期支持版 node。不要低于版本12
  • 安装jupyterhub
  1. sudo npm install -g configurable-http-proxy
  2. sudo python3 -m pip install jupyterhub
  • 生成ju配置文件
  1. jupyterhub --generate-config -f 【PATH】
  2. # 将【PATH】替换为对应的文件位置。若不指定PATH,则默认为当前文件夹
  • 配置ju文件
  1. c.Ju = '您的IP'
  2. c.Ju = 您的端口
  3. c.S = '127.0.0.1'
  4. c.PAMAu = 'utf8'
  5. c.Au = {'root','admin'} #默认不能使用root登录,需要修改配置
  6. c.LocalAu = True
  7. c.Au = {'root', 'admin'}
  8. c.Ju = 'dummyau;
  9. c.Ju = 'jupyterhub'
  10. c.S = '/volume1/study/' #jupyterhub自定义目录
  11. c.S = =['jupyterhub-singleuser']

默认情况下,密码为系统中该用户对应的密码

安装Dashboard插件

Kubernetes Dashboard 是 k8s集群的一个 WEB UI管理工具,代码托管在 github 上。

  • 安装

wget

安装之后会生成一个kuberne文件

  1. kind: ServiceapiVersion: v1metadata:
  2. labels:
  3. k8s-app: kubernetes-dashboard
  4. name: kubernetes-dashboard
  5. namespace: kube-systemspec:
  6. ports:
  7. - port: 443
  8. targetPort: 8443
  9. type: NodePort
  10. selector:
  11. 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 的方式实现。

  1. kind: ClusterRoleBinding
  2. apiVersion: rbac.au
  3. metadata:
  4. name: admin
  5. annotations:
  6. rbac.au: "true"
  7. roleRef:
  8. kind: ClusterRole
  9. name: cluster-admin
  10. apiGroup: rbac.au
  11. subjects:
  12. - kind: ServiceAccount
  13. name: admin
  14. namespace: kube-system
  15. ---
  16. apiVersion: v1
  17. kind: ServiceAccount
  18. metadata:
  19. name: admin
  20. namespace: kube-system
  21. labels:
  22. kuberne: "true"
  23. 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