一、环境准备
本文参考: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-growpart
LANG=en_US.UTF-8
growpart /dev/sda 2
xfs_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=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
修改为
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://172.17.3.143:8080/kubernetes/
enabled=1
gpgcheck=0
EOF
4.2.2、修改docker-ce.repo
cat << EOF > /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$(rpm --eval '%{centos_ver}')/\$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
修改为
cat << EOF > /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=http://172.17.3.143:8080/docker-ce-stable/
enabled=1
gpgcheck=0
EOF
注: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 - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=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.6
2、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.0
2、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 ingress
bash kainstall-centos.sh add --ingress nginx
# 添加 prometheus
bash kainstall-centos.sh add --monitor prometheus
# 添加 elasticsearch
bash kainstall-centos.sh add --log elasticsearch
# 添加 rook
bash kainstall-centos.sh add --storage rook
# 添加 nodelocaldns
bash 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 runtime
bash 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 runtime
bash 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 2048
openssl 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
#删除原有的证书secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#创建新的证书secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod
kubectl get pod -n kube-system
#删除pod,启动新pod生效
kubectl delete pod kubernetes-dashboard-5b9dd4f974-ztp89 -n kube-system
#编辑文件vim k8s-admin.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
kubectl create -f k8s-admin.yaml
kubectl get serviceaccount -n kube-system
kubectl describe serviceaccount admin -n kube-system
kubectl 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 wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-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/v1
kind: Deployment
metadata:
name: ingress-demo-app
labels:
app: ingress-demo-app
spec:
replicas: 2
selector:
matchLabels:
app: ingress-demo-app
template:
metadata:
labels:
app: ingress-demo-app
spec:
containers:
- name: whoami
image: traefik/whoami:v1.6.1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ingress-demo-app
spec:
type: ClusterIP
selector:
app: ingress-demo-app
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-demo-app
annotations:
kubernetes.io/ingress.class: traefik #注意此处为traefik,如果安装nginx ingress ,此处为nginx
spec:
rules:
- host: app.demo.com
http:
paths:
- path: /
backend:
serviceName: ingress-demo-app
servicePort: 80
6.2、查询ingress集群外访问端口号
这个端口我们可以在脚本kainstall-centos.sh 中自定义
6.3、解析服务域名
只要服务器部署到集群中,域名可以解析到任何一个worker节点服务器IP。
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
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
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
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 ,接下来就可以访问服务了。