一、环境准备

本文参考: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、扩容磁盘【可选】

  1. yum -y install cloud-utils-growpart
  2. LANG=en_US.UTF-8
  3. growpart /dev/sda 2
  4. xfs_growfs /dev/sda2

本文使用虚拟机,磁盘容量随用随扩。

切记:
所选服务器一定要是初始化的服务器,不能是安装过k8s集群的节点服务器,容器造成集群起来后的网络问题。

三、一键安装集群

前提:master服务器生成密钥,并把公钥放到worker和master自己服务器authorized_keys文件中。

3.1、生成密钥

  1. ssh-keygen -t rsa

3.2、分发密钥

  1. ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.3.153 #需要输入172.17.3.153服务器的密码
  2. ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.3.154 #需要输入172.17.3.154服务器的密码

如果服务器之间禁用密码登陆,那么可以手动将master服务添加到三台服务器上。

四、初始化集群

4.1、下载脚本,修改安装源为本地仓库源

由于集群初始化过程中会下载安装docker,kubeadm等工具,会非常耗时,此时我们选择使用搭建的本地仓库。

  1. #初始脚本
  2. wget https://dadong-files.oss-cn-beijing.aliyuncs.com/all_in_k8s/kainstall-centos.sh
  3. 更多可参考 https://github.com/lework/kainstall

本地仓库搭建过程,请参考本文

4.2、修改kainstall-centos.sh使用本地docker,kubernetes安装源。

4.2.1、修改kubernetes.repo

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF
  10. 修改为
  11. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  12. [kubernetes]
  13. name=Kubernetes
  14. baseurl=http://172.17.3.143:8080/kubernetes/
  15. enabled=1
  16. gpgcheck=0
  17. EOF

4.2.2、修改docker-ce.repo

  1. cat << EOF > /etc/yum.repos.d/docker-ce.repo
  2. [docker-ce-stable]
  3. name=Docker CE Stable - \$basearch
  4. baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$(rpm --eval '%{centos_ver}')/\$basearch/stable
  5. enabled=1
  6. gpgcheck=1
  7. gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
  8. EOF
  9. 修改为
  10. cat << EOF > /etc/yum.repos.d/docker-ce.repo
  11. [docker-ce-stable]
  12. name=Docker CE Stable - $basearch
  13. baseurl=http://172.17.3.143:8080/docker-ce-stable/
  14. enabled=1
  15. gpgcheck=0
  16. EOF

注:http://172.17.3.143:8080为本地YUM仓库。

4.2.3、修改CentOS 安装源

脚本中使用的是阿里云的安装源,刚开始可以用,后来阿里云的源在服务器上无法使用了,我们可以注释掉kainstall-centos.sh脚本中 更换安装源的代码
image.png
使用下面的安装源

  1. # CentOS-Base.repo
  2. #
  3. # The mirror system uses the connecting IP address of the client and the
  4. # update status of each mirror to pick mirrors that are updated to and
  5. # geographically close to the client. You should use this for CentOS updates
  6. # unless you are manually picking other mirrors.
  7. #
  8. # If the mirrorlist= does not work for you, as a fall back you can try the
  9. # remarked out baseurl= line instead.
  10. #
  11. #
  12. [base]
  13. name=CentOS-$releasever - Base
  14. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
  15. #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
  16. gpgcheck=1
  17. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  18. #released updates
  19. [updates]
  20. name=CentOS-$releasever - Updates
  21. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
  22. #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
  23. gpgcheck=1
  24. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  25. #additional packages that may be useful
  26. [extras]
  27. name=CentOS-$releasever - Extras
  28. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
  29. #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
  30. gpgcheck=1
  31. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  32. #additional packages that extend functionality of existing packages
  33. [centosplus]
  34. name=CentOS-$releasever - Plus
  35. mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
  36. #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
  37. gpgcheck=1
  38. enabled=0
  39. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

4.2.4、修改kube组件镜像源
image.png

  1. #修改kainstall-centos.sh脚本中,将registry.cn-hangzhou.aliyuncs.com/kainstall 更换为 registry.aliyuncs.com/google_containers或者自建仓库地址
  2. 否则会拉取kube组件镜像失败,如下
  3. [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
  4. , error: exit status 1
  5. ......

后续处理可以将所需要安装的k8s集群版本所对应的kube组件镜像加入到私有仓库,即可加快拉取速度。

4.2.5、修改kainstall-centos.sh脚本引用镜像

为了加速集群部署速度,脚本中涉及到三处文件修改,文件中涉及到几处共有镜像仓库需要修改。需要将公有镜像拉取到本地,然后上传至本地仓库,然后修改下面文件镜像引用地址,然后将脚本文件上传至OSS,以备下次使用。

  1. -------------------------------- recommended.yaml文件 --------------------
  2. recommended.yaml涉及两处镜像:
  3. 1kubernetesui/metrics-scraper:v1.0.6
  4. 修改为:
  5. registry.cn-hangzhou.aliyuncs.com/api_public/metrics-scraper:v1.0.6
  6. 2kubernetesui/dashboard:v2.3.1
  7. 修改为:
  8. registry.cn-hangzhou.aliyuncs.com/api_public/dashboard:v2.3.1
  9. -------------------------------- deploy.yaml文件 ------------------------
  10. #ingress-nginx 可以有traefik和nginx两种controller选择,默认为nginx controller,如果需要指定ingress-nginx为traefik,需要修改 KUBE_INGRESS="${KUBE_INGRESS:-traefik}"
  11. deploy.yaml涉及两处镜像:
  12. 1k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61a
  13. 修改为:
  14. registry.cn-hangzhou.aliyuncs.com/api_public/nginx-ingress-controller:v0.46.0
  15. 2docker.io/jettech/kube-webhook-certgen:v1.5.1
  16. 修改为:
  17. registry.cn-hangzhou.aliyuncs.com/api_public/kube-webhook-certgen:v1.5.1
  18. -------------------------------- components.yaml文件 --------------------
  19. components.yaml涉及一处镜像
  20. 1k8s.gcr.io/metrics-server/metrics-server:v0.5.0
  21. 修改为:
  22. registry.cn-hangzhou.aliyuncs.com/api_public/metrics-server:v0.5.0

4.2.6、修改dashboard service类型

  1. #由于我使用的是虚拟机部署集群,无SLB等外接设备,因此要想WEB访问集群,需要修改集群暴露服务类型
  2. 在脚本kainstall-centos.sh中的recommended.yaml文件定义了dashboard的访问方式,修改service类型为NodePort类型,方法参考:https://www.yuque.com/qinxi-cvygi/ires9z/giped9

4.3、执行脚本

4.3.1、查询安装版本 【可选】

  1. 此处版本version可以通过下面命令来查询
  2. 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)

  1. wget https://dadong-files.oss-cn-beijing.aliyuncs.com/all_in_k8s/kainstall-revised-edition/kainstall-centos.sh && bash kainstall-centos.sh init \
  2. --master 172.17.3.153 \
  3. --worker 172.17.3.154,172.17.3.155 \
  4. --user root \
  5. --password 123456 \
  6. --port 22 \
  7. --version 1.19.1

如果不使用本地镜像仓库,公网安装,此步安装失败时,可以重复执行此步操作。默认情况下,除了初始化集群外,还会安装 ingress: nginx , ui: dashboard 两个组件。如果使用默认nginx-ingress controller 大概率会出现下面提示,我这里选择了使用traefik ingress
image.png
亲测整个安装过程:
如果使用的公网镜像全部使用私有镜像,安装需要大约8分钟,coredns,default-http-backend,kubernetes-dashboard等初始化大约需要6分钟。

4.4、增加节点

  1. # 增加单个master节点
  2. bash kainstall-centos.sh add --master 172.17.3.135
  3. # 增加单个worker节点
  4. bash kainstall-centos.sh add --worker 172.17.3.134
  5. # 同时增加
  6. 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、删除节点

  1. # 删除单个master节点
  2. bash kainstall-centos.sh del --master 172.17.3.135
  3. # 删除单个worker节点
  4. bash kainstall-centos.sh del --worker 172.17.3.134
  5. # 同时删除
  6. 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、重置集群

  1. bash kainstall-centos.sh reset \
  2. --user root \
  3. --password 123456 \
  4. --port 22

4.7、其他操作

  1. # 添加 nginx ingress
  2. bash kainstall-centos.sh add --ingress nginx
  3. # 添加 prometheus
  4. bash kainstall-centos.sh add --monitor prometheus
  5. # 添加 elasticsearch
  6. bash kainstall-centos.sh add --log elasticsearch
  7. # 添加 rook
  8. bash kainstall-centos.sh add --storage rook
  9. # 添加 nodelocaldns
  10. bash kainstall-centos.sh add --addon nodelocaldns
  11. # 升级版本
  12. bash kainstall-centos.sh upgrade --version 1.20.6
  13. # 重新颁发证书
  14. bash kainstall-centos.sh renew-cert
  15. # debug模式
  16. DEBUG=1 bash kainstall-centos.sh
  17. # 更新脚本
  18. bash kainstall-centos.sh update
  19. # 使用 cri-o containerd runtime
  20. bash kainstall-centos.sh init \
  21. --master 172.17.3.128 \
  22. --worker 172.17.3.153,172.17.3.154 \
  23. --user root \
  24. --password 123456 \
  25. --cri containerd
  26. # 使用 cri-o cri runtime
  27. bash kainstall-centos.sh init \
  28. --master 172.17.3.128 \
  29. --worker 172.17.3.153,172.17.3.154 \
  30. --user root \
  31. --password 123456 \
  32. --cri cri-o

五、访问集群

当上面部署完毕后,若想在web页面访问集群,需要进行下面两步

5.1、配置TOKEN访问集群

  1. cd /etc/kubernetes && mkdir key && cd key
  2. #生成证书
  3. openssl genrsa -out dashboard.key 2048
  4. openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=dev-k8s.123.top' #此处的域名是我们web访问集群的域名,配置完毕后,必须使用域名才可访问。
  5. openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
  6. #删除原有的证书secret
  7. kubectl delete secret kubernetes-dashboard-certs -n kube-system
  8. #创建新的证书secret
  9. kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
  10. #查看pod
  11. kubectl get pod -n kube-system
  12. #删除pod,启动新pod生效
  13. kubectl delete pod kubernetes-dashboard-5b9dd4f974-ztp89 -n kube-system
  14. #编辑文件vim k8s-admin.yaml
  15. kind: ClusterRoleBinding
  16. apiVersion: rbac.authorization.k8s.io/v1beta1
  17. metadata:
  18. name: admin
  19. annotations:
  20. rbac.authorization.kubernetes.io/autoupdate: "true"
  21. roleRef:
  22. kind: ClusterRole
  23. name: cluster-admin
  24. apiGroup: rbac.authorization.k8s.io
  25. subjects:
  26. - kind: ServiceAccount
  27. name: admin
  28. namespace: kube-system
  29. ---
  30. apiVersion: v1
  31. kind: ServiceAccount
  32. metadata:
  33. name: admin
  34. namespace: kube-system
  35. labels:
  36. kubernetes.io/cluster-service: "true"
  37. addonmanager.kubernetes.io/mode: Reconcile
  38. kubectl create -f k8s-admin.yaml
  39. kubectl get serviceaccount -n kube-system
  40. kubectl describe serviceaccount admin -n kube-system
  41. kubectl describe secret admin-token-2frfz -n kube-system
  42. #保存最后一步命令查看到的token密钥,就是登录dashboard需要的令牌,完成登陆

5.2、解析dashboard域名

上面我们已经安装了dashboard,ingress controller,修改了dashboard service类型为NodePort类型,因此访问方式应该为ingress controller 所在的node IP:dashboard NodePort

  1. #查询ingress-nginx-controller 所在服务器IP地址
  2. kubectl get pod -n ingress-nginx -o wide
  3. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  4. ingress-nginx-controller-8b4fb6fd8-7xvcj 1/1 Running 0 19m 10.244.1.3 k8s-worker-node1 <none> <none>
  5. #解析dev-k8s.123.top到对应服务器IP,即
  6. dev-k8s.123.top 172.17.3.155

5.3、访问k8s dashboard

拿到上面获取到的token密钥,登陆域名https://dev-k8s.123.top
image.png
注意,google浏览器由于对SSL证书的认证原因,会阻止打开自签名证书的域名,mac电脑可以使用safai浏览器,window电脑可以使用火狐浏览器。

六、部署服务

6.1、部署测试服务

如果ingress-nginx controller为traefik,默认集群安装完毕后,会安装一个名为app.demo.com的测试服务。

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: ingress-demo-app
  6. labels:
  7. app: ingress-demo-app
  8. spec:
  9. replicas: 2
  10. selector:
  11. matchLabels:
  12. app: ingress-demo-app
  13. template:
  14. metadata:
  15. labels:
  16. app: ingress-demo-app
  17. spec:
  18. containers:
  19. - name: whoami
  20. image: traefik/whoami:v1.6.1
  21. ports:
  22. - containerPort: 80
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27. name: ingress-demo-app
  28. spec:
  29. type: ClusterIP
  30. selector:
  31. app: ingress-demo-app
  32. ports:
  33. - name: http
  34. port: 80
  35. targetPort: 80
  36. ---
  37. apiVersion: networking.k8s.io/v1beta1
  38. kind: Ingress
  39. metadata:
  40. name: ingress-demo-app
  41. annotations:
  42. kubernetes.io/ingress.class: traefik #注意此处为traefik,如果安装nginx ingress ,此处为nginx
  43. spec:
  44. rules:
  45. - host: app.demo.com
  46. http:
  47. paths:
  48. - path: /
  49. backend:
  50. serviceName: ingress-demo-app
  51. servicePort: 80

6.2、查询ingress集群外访问端口号

image.png

这个端口我们可以在脚本kainstall-centos.sh 中自定义
image.png

6.3、解析服务域名

只要服务器部署到集群中,域名可以解析到任何一个worker节点服务器IP。

  1. $ kubectl get nodes -o wide
  2. NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
  3. k8s-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.7
  4. k8s-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.7
  5. k8s-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 ,接下来就可以访问服务了。
image.png