一、环境准备
本文参考:https://github.com/qinxi89/kainstall
OS:
centos 7.x x64 , centos 8.x x64, debian 9.x x64 , debian 10.x x64
服务器配置:
4C 8G
认证:
集群节点需统一认证; 使用密码认证时,集群节点需使用同一用户名和密码,使用密钥认证时,集群节点需使用同一个密钥文件登陆。
本文使用一台master,两台worker机器,配置4C 8G 50G硬盘
二、启动模板机器
2.1、查看机器时间
由于本文搭建环境为虚拟机,因而存在时间不同步的问题,故提前做了一提前安装时间同步软件的模板机器,本文使用的master,worker服务器都是同一模板机器而来,k8s集群对于彼此间的时间同步要求较高,如果时间不同步,会造成集群某些组件无法启动。
2.2、扩容磁盘【可选】
yum -y install cloud-utils-growpartLANG=en_US.UTF-8growpart /dev/sda 2xfs_growfs /dev/sda2
本文使用虚拟机,磁盘容量随用随扩。
切记:
所选服务器一定要是初始化的服务器,不能是安装过k8s集群的节点服务器,容器造成集群起来后的网络问题。
三、一键安装集群
前提:master服务器生成密钥,并把公钥放到worker和master自己服务器authorized_keys文件中。
3.1、生成密钥
ssh-keygen -t rsa
3.2、分发密钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.3.153 #需要输入172.17.3.153服务器的密码ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.3.154 #需要输入172.17.3.154服务器的密码
如果服务器之间禁用密码登陆,那么可以手动将master服务添加到三台服务器上。
四、初始化集群
4.1、下载脚本,修改安装源为本地仓库源
由于集群初始化过程中会下载安装docker,kubeadm等工具,会非常耗时,此时我们选择使用搭建的本地仓库。
#初始脚本wget https://dadong-files.oss-cn-beijing.aliyuncs.com/all_in_k8s/kainstall-centos.sh更多可参考 https://github.com/lework/kainstall
本地仓库搭建过程,请参考本文
4.2、修改kainstall-centos.sh使用本地docker,kubernetes安装源。
4.2.1、修改kubernetes.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF修改为cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://172.17.3.143:8080/kubernetes/enabled=1gpgcheck=0EOF
4.2.2、修改docker-ce.repo
cat << EOF > /etc/yum.repos.d/docker-ce.repo[docker-ce-stable]name=Docker CE Stable - \$basearchbaseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$(rpm --eval '%{centos_ver}')/\$basearch/stableenabled=1gpgcheck=1gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpgEOF修改为cat << EOF > /etc/yum.repos.d/docker-ce.repo[docker-ce-stable]name=Docker CE Stable - $basearchbaseurl=http://172.17.3.143:8080/docker-ce-stable/enabled=1gpgcheck=0EOF
注:http://172.17.3.143:8080为本地YUM仓库。
4.2.3、修改CentOS 安装源
脚本中使用的是阿里云的安装源,刚开始可以用,后来阿里云的源在服务器上无法使用了,我们可以注释掉kainstall-centos.sh脚本中 更换安装源的代码
使用下面的安装源
# CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update status of each mirror to pick mirrors that are updated to and# geographically close to the client. You should use this for CentOS updates# unless you are manually picking other mirrors.## If the mirrorlist= does not work for you, as a fall back you can try the# remarked out baseurl= line instead.##[base]name=CentOS-$releasever - Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#released updates[updates]name=CentOS-$releasever - Updatesmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#additional packages that may be useful[extras]name=CentOS-$releasever - Extrasmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7#additional packages that extend functionality of existing packages[centosplus]name=CentOS-$releasever - Plusmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/gpgcheck=1enabled=0gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
4.2.4、修改kube组件镜像源
#修改kainstall-centos.sh脚本中,将registry.cn-hangzhou.aliyuncs.com/kainstall 更换为 registry.aliyuncs.com/google_containers或者自建仓库地址否则会拉取kube组件镜像失败,如下[ERROR ImagePull]: failed to pull image registry.cn-hangzhou.aliyuncs.com/kainstall/kube-apiserver:v1.19.1: output: Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/kainstall/kube-apiserver:v1.19.1 not found: manifest unknown: manifest unknown, error: exit status 1......
后续处理可以将所需要安装的k8s集群版本所对应的kube组件镜像加入到私有仓库,即可加快拉取速度。
4.2.5、修改kainstall-centos.sh脚本引用镜像
为了加速集群部署速度,脚本中涉及到三处文件修改,文件中涉及到几处共有镜像仓库需要修改。需要将公有镜像拉取到本地,然后上传至本地仓库,然后修改下面文件镜像引用地址,然后将脚本文件上传至OSS,以备下次使用。
-------------------------------- recommended.yaml文件 --------------------recommended.yaml涉及两处镜像:1、kubernetesui/metrics-scraper:v1.0.6修改为:registry.cn-hangzhou.aliyuncs.com/api_public/metrics-scraper:v1.0.62、kubernetesui/dashboard:v2.3.1修改为:registry.cn-hangzhou.aliyuncs.com/api_public/dashboard:v2.3.1-------------------------------- deploy.yaml文件 ------------------------#ingress-nginx 可以有traefik和nginx两种controller选择,默认为nginx controller,如果需要指定ingress-nginx为traefik,需要修改 KUBE_INGRESS="${KUBE_INGRESS:-traefik}"deploy.yaml涉及两处镜像:1、k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61a修改为:registry.cn-hangzhou.aliyuncs.com/api_public/nginx-ingress-controller:v0.46.02、docker.io/jettech/kube-webhook-certgen:v1.5.1修改为:registry.cn-hangzhou.aliyuncs.com/api_public/kube-webhook-certgen:v1.5.1-------------------------------- components.yaml文件 --------------------components.yaml涉及一处镜像1、k8s.gcr.io/metrics-server/metrics-server:v0.5.0修改为:registry.cn-hangzhou.aliyuncs.com/api_public/metrics-server:v0.5.0
4.2.6、修改dashboard service类型
#由于我使用的是虚拟机部署集群,无SLB等外接设备,因此要想WEB访问集群,需要修改集群暴露服务类型在脚本kainstall-centos.sh中的recommended.yaml文件定义了dashboard的访问方式,修改service类型为NodePort类型,方法参考:https://www.yuque.com/qinxi-cvygi/ires9z/giped9
4.3、执行脚本
4.3.1、查询安装版本 【可选】
此处版本version可以通过下面命令来查询yum list kubelet --showduplicates | sort -r
4.3.2、初始化集群
下载修订版脚本:wget https://dadong-files.oss-cn-beijing.aliyuncs.com/all_in_k8s/kainstall-revised-edition/kainstall-centos.sh
使用本脚本之前请先确认所有的节点服务器可以访公网,并且yum 源是可用的,否则在安装过程中会导致组件安装失败,尤其是(yum install -y haproxy)
wget https://dadong-files.oss-cn-beijing.aliyuncs.com/all_in_k8s/kainstall-revised-edition/kainstall-centos.sh && bash kainstall-centos.sh init \--master 172.17.3.153 \--worker 172.17.3.154,172.17.3.155 \--user root \--password 123456 \--port 22 \--version 1.19.1
如果不使用本地镜像仓库,公网安装,此步安装失败时,可以重复执行此步操作。默认情况下,除了初始化集群外,还会安装 ingress: nginx , ui: dashboard 两个组件。如果使用默认nginx-ingress controller 大概率会出现下面提示,我这里选择了使用traefik ingress
亲测整个安装过程:
如果使用的公网镜像全部使用私有镜像,安装需要大约8分钟,coredns,default-http-backend,kubernetes-dashboard等初始化大约需要6分钟。
4.4、增加节点
# 增加单个master节点bash kainstall-centos.sh add --master 172.17.3.135# 增加单个worker节点bash kainstall-centos.sh add --worker 172.17.3.134# 同时增加bash kainstall-centos.sh add --master 172.17.3.135,172.17.3.136 --worker 172.17.3.137,172.17.3.138
4.5、删除节点
# 删除单个master节点bash kainstall-centos.sh del --master 172.17.3.135# 删除单个worker节点bash kainstall-centos.sh del --worker 172.17.3.134# 同时删除bash kainstall-centos.sh del --master 172.17.3.135,172.17.3.136 --worker 172.17.3.137,172.17.3.138
4.6、重置集群
bash kainstall-centos.sh reset \--user root \--password 123456 \--port 22
4.7、其他操作
# 添加 nginx ingressbash kainstall-centos.sh add --ingress nginx# 添加 prometheusbash kainstall-centos.sh add --monitor prometheus# 添加 elasticsearchbash kainstall-centos.sh add --log elasticsearch# 添加 rookbash kainstall-centos.sh add --storage rook# 添加 nodelocaldnsbash kainstall-centos.sh add --addon nodelocaldns# 升级版本bash kainstall-centos.sh upgrade --version 1.20.6# 重新颁发证书bash kainstall-centos.sh renew-cert# debug模式DEBUG=1 bash kainstall-centos.sh# 更新脚本bash kainstall-centos.sh update# 使用 cri-o containerd runtimebash kainstall-centos.sh init \--master 172.17.3.128 \--worker 172.17.3.153,172.17.3.154 \--user root \--password 123456 \--cri containerd# 使用 cri-o cri runtimebash kainstall-centos.sh init \--master 172.17.3.128 \--worker 172.17.3.153,172.17.3.154 \--user root \--password 123456 \--cri cri-o
五、访问集群
当上面部署完毕后,若想在web页面访问集群,需要进行下面两步
5.1、配置TOKEN访问集群
cd /etc/kubernetes && mkdir key && cd key#生成证书openssl genrsa -out dashboard.key 2048openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=dev-k8s.123.top' #此处的域名是我们web访问集群的域名,配置完毕后,必须使用域名才可访问。openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt#删除原有的证书secretkubectl delete secret kubernetes-dashboard-certs -n kube-system#创建新的证书secretkubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system#查看podkubectl get pod -n kube-system#删除pod,启动新pod生效kubectl delete pod kubernetes-dashboard-5b9dd4f974-ztp89 -n kube-system#编辑文件vim k8s-admin.yamlkind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: adminannotations:rbac.authorization.kubernetes.io/autoupdate: "true"roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.iosubjects:- kind: ServiceAccountname: adminnamespace: kube-system---apiVersion: v1kind: ServiceAccountmetadata:name: adminnamespace: kube-systemlabels:kubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcilekubectl create -f k8s-admin.yamlkubectl get serviceaccount -n kube-systemkubectl describe serviceaccount admin -n kube-systemkubectl describe secret admin-token-2frfz -n kube-system#保存最后一步命令查看到的token密钥,就是登录dashboard需要的令牌,完成登陆
5.2、解析dashboard域名
上面我们已经安装了dashboard,ingress controller,修改了dashboard service类型为NodePort类型,因此访问方式应该为ingress controller 所在的node IP:dashboard NodePort
#查询ingress-nginx-controller 所在服务器IP地址kubectl get pod -n ingress-nginx -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESingress-nginx-controller-8b4fb6fd8-7xvcj 1/1 Running 0 19m 10.244.1.3 k8s-worker-node1 <none> <none>#解析dev-k8s.123.top到对应服务器IP,即dev-k8s.123.top 172.17.3.155
5.3、访问k8s dashboard
拿到上面获取到的token密钥,登陆域名https://dev-k8s.123.top
注意,google浏览器由于对SSL证书的认证原因,会阻止打开自签名证书的域名,mac电脑可以使用safai浏览器,window电脑可以使用火狐浏览器。
六、部署服务
6.1、部署测试服务
如果ingress-nginx controller为traefik,默认集群安装完毕后,会安装一个名为app.demo.com的测试服务。
---apiVersion: apps/v1kind: Deploymentmetadata:name: ingress-demo-applabels:app: ingress-demo-appspec:replicas: 2selector:matchLabels:app: ingress-demo-apptemplate:metadata:labels:app: ingress-demo-appspec:containers:- name: whoamiimage: traefik/whoami:v1.6.1ports:- containerPort: 80---apiVersion: v1kind: Servicemetadata:name: ingress-demo-appspec:type: ClusterIPselector:app: ingress-demo-appports:- name: httpport: 80targetPort: 80---apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:name: ingress-demo-appannotations:kubernetes.io/ingress.class: traefik #注意此处为traefik,如果安装nginx ingress ,此处为nginxspec:rules:- host: app.demo.comhttp:paths:- path: /backend:serviceName: ingress-demo-appservicePort: 80
6.2、查询ingress集群外访问端口号

这个端口我们可以在脚本kainstall-centos.sh 中自定义
6.3、解析服务域名
只要服务器部署到集群中,域名可以解析到任何一个worker节点服务器IP。
$ kubectl get nodes -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEk8s-master-node1 Ready master 3h31m v1.19.1 172.17.3.175 <none> CentOS Linux 7 (Core) 3.10.0-1160.71.1.el7.x86_64 docker://20.10.7k8s-worker-node1 Ready worker 3h31m v1.19.1 172.17.3.153 <none> CentOS Linux 7 (Core) 3.10.0-1160.71.1.el7.x86_64 docker://20.10.7k8s-worker-node2 Ready worker 3h31m v1.19.1 172.17.3.154 <none> CentOS Linux 7 (Core) 3.10.0-1160.71.1.el7.x86_64 docker://20.10.7
服务部署完毕后,我们可以将app.demo.com解析到worker节点 node1的IP ,接下来就可以访问服务了。
