我选用了三台服务器,一台做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