基于kubeasz3.1.0搭建k8s:v1.21.0
由于上次组件的k8s集群,dashboard不能使用,现在降低k8s的版本为v1.21.0,环境和k8s:v1.23.1一模一样,请跳转至https://www.cnblogs.com/fengshen220/p/15802816.html,查看第一部分环境准备:
规划机器和地址:
server网段使用:10.200.0.0/16
node的网段:172.20.0.0/16
vip:192.168.37.220
kubeasz_3.1.0.tar
docker-20.10.5.tgz
metrics-server_v0.3.6.tar
metrics-scraper_v1.0.6.tar
coredns_1.8.0.tar
pause_3.4.1.tar
k8s-dns-node-cache_1.17.0.tar
nfs-provisioner_v4.0.1.tar
dashboard_v2.2.0.tar
pause.tar
flannel_v0.13.0-amd64.tar
calico_v3.15.3.tar
k8s:v1.21.0
拷贝hosts文件脚本
#!/bin/bash . /etc/init.d/functions HarborHostname=k8s-harbor.taozi.net #目标主机列表,只需要所有master和node节点即可,包括本机 IP=" 192.168.37.102 192.168.37.103 192.168.37.104 192.168.37.105 192.168.37.106 192.168.37.107 192.168.37.108 192.168.37.109 192.168.37.110 " scp_key(){ for node in $IP;do sshpass -p lijian ssh-copy-id ${node} -o StrictHostKeyChecking=no &>/dev/null if [ 0 -eq 0 ];then action "${node}秘钥copy完成" else action "${node}秘钥copy失败" fi done } scp_hosts(){ for node in $IP;do sshpass -p lijian ssh-copy-id ${node} -o StrictHostKeyChecking=no &> /dev/null if [ 0 -eq 0 ];then scp /etc/hosts ${node}:/etc/hosts &> /dev/null action "${node} host 文件拷贝完成" # scp -r /root/.docker ${node}:/root/ # else # action "${node} hosts文件copy失败" fi done } scp_srt(){ for node in $IP;do sshpass -p lijian ssh-copy-id ${node} -o StrictHostKeyChecking=no &> /dev/null if [ 0 -eq 0 ];then ssh ${node} "mkdir /etc/docker/certs.d/${HarborHostname} -p" &> /dev/null action "Harbor 证书目录创建成功!" scp /apps/harbor/certs/${HarborHostname}/${HarborHostname}.crt ${node}:/etc/docker/certs.d/${HarborHostname}/harbor-ca.crt action "Harbor 证书拷贝成功!" #scp -r /root/.docker ${node}:/root/ #action "Harbor 认证文件拷贝完成!" # else # action "${node} 证书copy失败" fi done } #scp_key scp_hosts #scp_srt
可以提前在每个节点上安装需要的工具:
yum install -y conntrack-tools ipvsadm nfs-utils psmisc rsync socat
说明:对比之前版本配置文件,该版本将大部分的变量集成在./example/config.yml文件中,配置部分解释:
MASTER_CERT_HOSTS: - 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS
CA_EXPIRY: "876000h" - 证书的有效期配置
NODE_CIDR_LEN: - node 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址)
INSTALL_SOURCE: "offline" - 配置使用离线安装系统包(需要ezdown -P 下载离线系统软件)
NODE_CIDR_LEN - ode 节点上 pod 网段掩码长度(决定每个节点最多能分配的pod ip地址)
时间可能较长,一些镜像需要去官网下载,本次拉去运行./ezdown -D花费将近3个小时;可以在正式部署之前选用离线模式先把各种镜像拉取下来./ezdown -P
# 下载工具脚本ezdown,举例使用kubeasz版本3.0.0 export release=3.1.0 wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown chmod +x ./ezdown # 使用工具脚本下载 ./ezdown -D ./ezctl new k8s-01
配置'/etc/kubeasz/clusters/k8s-01/hosts' 和 '/etc/kubeasz/clusters/k8s-01/config.yml'
cd /etc/kubeasz cp /etc/kubeasz/k8s-01/hosts.multi-node hosts grep ^[^#] hosts [etcd] 192.168.37.102 192.168.37.103 192.168.37.104 # master node(s) [kube_master] 192.168.37.102 192.168.37.103 192.168.37.104 # work node(s) [kube_node] 192.168.37.110 192.168.37.108 192.168.37.109 [harbor] [ex_lb] 192.168.37.106 LB_ROLE=master EX_APISERVER_VIP=192.168.37.220 EX_APISERVER_PORT=6443 192.168.37.107 LB_ROLE=backup EX_APISERVER_VIP=192.168.37.220 EX_APISERVER_PORT=6443 [chrony] [all:vars] SECURE_PORT="6443" CONTAINER_RUNTIME="docker" CLUSTER_NETWORK="flannel" PROXY_MODE="ipvs" SERVICE_CIDR="172.20.0.0/16" CLUSTER_CIDR="10.200.0.0/16" NODE_PORT_RANGE="30000-60000" CLUSTER_DNS_DOMAIN="taizo.local" bin_dir="/usr/bin" base_dir="/etc/kubeasz" cluster_dir="{{ base_dir }}/clusters/k8s-01" ca_dir="/etc/kubernetes/ssl"
hosts文件解释:
[etcd] 192.168.3.147 NODE_NAME=etcd1 #etcd集群中,每个节点需要有一个独一无二的名称,不能重复 [kube-master] 192.168.3.141 #master节点 [kube-node] #node节点 192.168.3.144 [ex-lb] #主要指定apiserver的使用的高可用的VIP; 192.168.3.221 LB_ROLE=master EX_APISERVER_VIP=192.168.3.188 EX_APISERVER_PORT=6443 192.168.3.222 LB_ROLE=backup EX_APISERVER_VIP=192.168.3.188 EX_APISERVER_PORT=6443 CONTAINER_RUNTIME="docker" #指定使用的容器运行时 # Secure port for apiservers SECURE_PORT="6443" #指定在master上运行的apiserver的端口 CLUSTER_NETWORK="flannel" #指定网络插件 PROXY_MODE="ipvs" #指定service类型使用ipvs SERVICE_CIDR="172.31.0.0/16" #指定service网段 CLUSTER_CIDR="10.10.0.0/16" #pod网段 NODE_PORT_RANGE="30000-60000" #nodeport端口范围 CLUSTER_DNS_DOMAIN="taizo.local." #service的域名后缀,凡是后期创建所有service的后缀都是这个, bin_dir="/usr/bin" #指定二进制程序路径,把安装的二进制程序存放到各个节点的/usr/bin/下,后期当进入master或者node上可直接执行这些程序 ca_dir="/etc/kubernetes/ssl" #证书路径 base_dir="/etc/ansible" #kubeasz的工作路径
准备开始执行playbook,修改playbooks/01.prepare.yml,因为前期已经同步了时间和部署了负载均衡,所以将这两条注释了
vim playbooks/01.prepare.yml
证书的申请信息放这里面,CA_EXPIRY变量是证书有效期时间:
ll roles/deploy/templates/ca-csr.json.j2 #过滤该变量,变量时间文件 grep CA_EXPIRY . -R
内核优化参数文件:roles/prepare/templates/95-k8s-sysctl.conf.j2 需要修改可以提前修改。
修改部分文件:
- harbor的认证文件,使用脚本ansible直接拷贝
将harbor上的证书拷贝到本机,在官方的playbook上加上拷贝任务:
cd /etc/kubeasz/roles/docker/files scp 192.168.37.105:/apps/harbor/certs/22/ca.crt . vim /etc/kubeasz/roles/docker/tasks/main.yml #在/etc/kubeasz/roles/docker/tasks/main.yml文件的最后加上拷贝的任务; - name: 创建harbor的证书目录 file: path=/etc/docker/certs.d/k8s-harbor.taozi.net/ state=directory - name: 下载harbor的证书文件 copy: src=ca.crt dest=/etc/docker/certs.d/k8s-harbor.taozi.net/k8s-harbor.taozi.net.crt mode=0644
开始部署:
执行01,安装证书及初始化:
这里提示了一个错误,显示本机有ca的两个时间变量未定义,但本机为102机器,已全部运行成功,故先暂时不处理。
该版本需使用ezctl进行安装,安装之前先命名集群名称,该名称为k8s-01,安装尽量将所有的错误都解决;
#01步骤不要轻易执行,会改变证书 ./ezctl setup k8s-01 01
执行02,安装etcd:
<P>./ezctl setup k8s-01 02 </P>
完成后在103上查看etcd进程
#官方的检查for循环有问题,应该是旧版本的脚本,没有修改路径,下边是修改后的心跳检查脚本;
export NODE_IPS="192.168.37.102 192.168.37.103 192.168.37.104" for ip in ${NODE_IPS}; do ETCDCTL_API=3 etcdctl \ --endpoints=https://${ip}:2379 \ --cacert=/etc/kubernetes/ssl/ca.pem \ --cert=/etc/kubernetes/ssl/etcd.pem \ --key=/etc/kubernetes/ssl/etcd-key.pem \ endpoint health; done
报错分析:
"error":"cluster ID mismatch"
之前这个节点上安装了etcd,需要将--data_dir中的所有数据清空即可
rm -rf /var/lib/etcd/
执行03,创建容器运行时:
#roles/docker/templates/daemon.json.j2已配置国内镜像加速,需要的可以修改:
前面因为部署得harbor是基于https的,所以牵扯harbor的证书问题,可以两种方法解决:
- 安装docker完成后用上面的分发脚本在harbor上进行分发
将证书放到每个node和需要打镜像的服务器上(可以使用前面的脚本分发):
#在每个node和需要打镜像的服务器创建 mkdir -pv /etc/docker/certs.d/k8s-harbor.taozi.net/ -p #将证书文件复制到本地: scp -r k8s-harbor.taozi.net:/apps/harbor/certs/k8s-harbor.taozi.net.crt /etc/docker/certs.d/k8s-harbor.taozi.net/ca.crt
<P>./ezctl setup k8s-01 03 </P>
在其他节点上验证是否能push镜像:
修改下标签:
docker tag easzlab/kubeasz:3.2.0 k8s-harbor.taozi.net/test/easzlab/kubeasz:3.2.0 docker push k8s-harbor.taozi.net/test/easzlab/kubeasz:3.2.0
#查看docker的版本
./bin/docker version
- 下面的部署会牵扯到镜像的拉取,修改拉取镜像路径,在线部署k8s,部分镜像为GitHub仓库内的镜像,这些镜像已经被kubuasz下载到了down目录下了,需要将这些镜像先加载到本机,在打标签,修改为本地harbor,可以节约大量时间:
cd /etc/kubeasz tar=`ls down`;for IM in ${tar};do docker load -i down/${IM};done 利用脚本将镜像全部上传至harbor上 vim imgaes_pull.sh #!/bin/bash IM=" easzlab/kubeasz:3.1.0 easzlab/kubeasz-ext-bin:0.9.4 easzlab/kubeasz-k8s-bin:v1.21.0 easzlab/nfs-subdir-external-provisioner:v4.0.1 kubernetesui/dashboard:v2.2.0 easzlab/k8s-dns-node-cache:1.17.0 easzlab/pause-amd64:3.4.1 coredns/coredns:1.8.0 kubernetesui/metrics-scraper:v1.0.6 easzlab/flannel:v0.13.0-amd64 calico/node:v3.15.3 calico/pod2daemon-flexvol:v3.15.3 calico/cni:v3.15.3 calico/kube-controllers:v3.15.3 mirrorgooglecontainers/metrics-server-amd64:v0.3.6 " for A in $IM;do docker tag $A k8s-harbor.taozi.net/k8s-01/$A docker push k8s-harbor.taozi.net/k8s-01/$A done
修改下面步骤可能使用到的镜像路径(如用不到的组件可以不修改):
vim clusters/k8s-01/config.yml SANDBOX_IMAGE: "k8s-harbor.taozi.net/k8s-01/easzlab/pause-amd64:3.4.1" flanneld_image: "k8s-harbor.taozi.net/k8s-01/easzlab/flannel:{{ flannelVer }}" #修改calico组件镜像 vim roles/calico/templates/calico-v3.15.yaml.j2 image: k8s-harbor.taozi.net/k8s-01/calico/kube-controllers:v3.15.3 image: k8s-harbor.taozi.net/k8s-01/calico/cni:v3.15.3 image: k8s-harbor.taozi.net/k8s-01/calico/pod2daemon-flexvol:v3.15.3 image: k8s-harbor.taozi.net/k8s-01/calico/node:v3.15.3 #修改dashboard组件镜像 vim roles/cluster-addon/templates/dashboard/kubernetes-dashboard.yaml image: k8s-harbor.taozi.net/k8s-01/kubernetesui/dashboard:v2.2.0 image: k8s-harbor.taozi.net/k8s-01/kubernetesui/metrics-scraper:v1.0.6 #修改metrics-server组件镜像 vim roles/cluster-addon/templates/metrics-server/components.yaml image: k8s-harbor.taozi.net/k8s-01/mirrorgooglecontainers/metrics-server-amd64:v0.3.6 #修改coredns组件镜像 vim roles/cluster-addon/templates/dns/coredns.yaml.j2 image: k8s-harbor.taozi.net/k8s-01/coredns/coredns:{{ corednsVer }} vim roles/cluster-addon/templates/dns/nodelocaldns-ipvs.yaml.j2 image: k8s-harbor.taozi.net/k8s-01/easzlab/k8s-dns-node-cache:1.17.0 ... .:53 { errors cache 30 reload loop bind {{ LOCAL_DNS_CACHE }} #forward . __PILLAR__UPSTREAM__SERVERS__ #下面指向外网或者公司内部的dns服务器 forward . 223.6.6.6 prometheus :9253 } ...
执行04:,安装master节点:
证书相关信息放在roles/kube-master/templates/kubernetes-csr.json.j2内,如需要修改可以自行修改:
kubernetes apiserver 使用对等证书,创建时hosts字段需要配置:
- 如果配置 ex_lb,需要把 EX_APISERVER_VIP 也配置进去
- 如果需要外部访问 apiserver,可选在config.yml配置 MASTER_CERT_HOSTS
- kubectl get svc 将看到集群中由api-server 创建的默认服务 kubernetes,因此也要把 kubernetes 服务名和各个服务域名也添加进去
<P>./ezctl setup k8s-01 04 </P>
注意:往master会请求VIP,这里要注意haproxy的配置一定要正确,后端服务器如果专项不对,master会起不来;
<P>kubectl get node </P>
执行05:,安装node节点:
注意:在roles/kube-node/templates/kubelet.service.j2里面有个基础容器
- --pod-infra-container-image 指定基础容器(负责创建Pod 内部共享的网络、文件系统等)镜像,K8S每一个运行的 POD里面必然包含这个基础容器,如果它没有运起来那么你的POD 肯定创建不了,kubelet日志里面会看到类似 FailedCreatePodSandBox 错误,可用docker images 查看节点是否已经下载到该镜像
这个选项是一个变量SANDBOX_IMAGE,查询这个变量,在/clusters/k8s-01/config.yml找到:
./ezctl setup k8s-01 05 kubectl get node
执行06,安装网络组件:(只能选一种组件这里选calico)
检查hosts文件的网络组件:
<P>vim clusters/k8s-01/hosts </P>
# 设置 APISERVER 地址,使用kube-lb负载均衡监听地址vip:192.168.37.220
vim roles/kube-node/vars/main.yml
KUBE_APISERVER: "https://192.168.37.220:{{ SECURE_PORT }}"
kubectl exec -it -n kube-system kube-flannel-ds-amd64-845jg sh
/ # cd /etc/kube-flannel/ /etc/kube-flannel # ls
cni-conf.json net-conf.json
/etc/kube-flannel # cat net-conf.json { "Network": "10.105.128.0/21", "SubnetLen": 26, "Backend": { "Type": "vxlan" } }
<P>./ezctl setup k8s-01 06 </P>
完成后等待容器都running
查看kubelet状态
journalctl -f -u kubelet
查命令: kubectl describe pod net-test1 --namespace=default kubectl describe pod kube-flannel-ds-8zdb8 --namespace=kube-system kubectl get svc kubectl get endpoints kubernetes --namespace=default -o yaml 删除pod: kubectl delete pod kube-flannel-ds-jqcqk --namespace=kube-system 检查日志: kubectl logs --namespace=kube-system kube-flannel-ds-5d7jf kubectl get events 查看kube-controller-manager启动状态 systemctl status kube-controller-manager -l
启动后需要验证网络通不通
1. 启动deploy
kubectl create deployment deployment-nginx --image=k8s-harbor.taozi.net/test/nginx:1.14-alpine
2. scale 3个
kubectl scale --replicas=3 deployments.apps/deployment-nginx
3. 查看位于不同节点的pod 能否基于端口通信
查看3个pod的地址,条算任意一个进去
kubectl exec -it deployment-nginx-7fd9bb74cc-9f68b -- sh
验证内网:
验证外网:
执行07,安装k8s的组件
安装DNS和dashboard(这里选择coredns):
进入一个容器,查询/etc/resolv.conf,拿到local dns cache 地址:
/ # cat /etc/resolv.conf nameserver 169.254.20.10 search default.svc.taizo.local svc.taizo.local taizo.local taozi.net options ndots:5
参考资料-在 Kubernetes 集群中使用 NodeLocal DNSCache:https://kubernetes.io/zh/docs/tasks/administer-cluster/nodelocaldns/
执行ansible:
<P>ezctl setup k8s-01 07 </P>
测试DNS:
kubectl exec -it deployment-nginx-7fd9bb74cc-9f68b -- sh ping kube-dns-upstream.kube-system.svc.taozi.local -c1 ping kube-dns.kube-system.svc.taozi.local -c1 ping www.jd.com -c1
这里测试使用的dashboardVer: "v2.2.0"版本,也可以使用;
安装dashboard先查询兼容情况:https://github.com/kubernetes/dashboard/releases
dashboard的最新版本是v2.4.0兼容到k8s:1.21:
查看dashboard的打开的端口
<P>kubectl get svc -A </P>
网页进行登录:
查看令牌:
<P>kubectl get secret -A | grep admin </P>
查询token
<P>kubectl describe secret -n kube-system admin-user-token-r9qtc </P>
登录成功:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构