基于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,查看第一部分环境准备:

规划机器和地址:

image

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"

clipboard

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

clipboard

证书的申请信息放这里面,CA_EXPIRY变量是证书有效期时间:

ll roles/deploy/templates/ca-csr.json.j2
#过滤该变量,变量时间文件
grep CA_EXPIRY . -R

clipboard

内核优化参数文件: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

clipboard

开始部署:

执行01,安装证书及初始化:

这里提示了一个错误,显示本机有ca的两个时间变量未定义,但本机为102机器,已全部运行成功,故先暂时不处理。

该版本需使用ezctl进行安装,安装之前先命名集群名称,该名称为k8s-01,安装尽量将所有的错误都解决;

#01步骤不要轻易执行,会改变证书 ./ezctl setup k8s-01 01

clipboard

执行02,安装etcd:

<P>./ezctl setup k8s-01 02 </P>

完成后在103上查看etcd进程

clipboard

#官方的检查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

clipboard

报错分析:

"error":"cluster ID mismatch"

之前这个节点上安装了etcd,需要将--data_dir中的所有数据清空即可

rm -rf /var/lib/etcd/

执行03,创建容器运行时:

#roles/docker/templates/daemon.json.j2已配置国内镜像加速,需要的可以修改:

clipboard

前面因为部署得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

clipboard

#查看docker的版本

./bin/docker version

clipboard

  • 下面的部署会牵扯到镜像的拉取,修改拉取镜像路径,在线部署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>

clipboard

注意:往master会请求VIP,这里要注意haproxy的配置一定要正确,后端服务器如果专项不对,master会起不来;

<P>kubectl get node </P>

clipboard

执行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找到:

clipboard

./ezctl setup k8s-01 05
kubectl get node

clipboard

执行06,安装网络组件:(只能选一种组件这里选calico)

检查hosts文件的网络组件:

<P>vim clusters/k8s-01/hosts </P>

clipboard

clipboard

# 设置 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

clipboard

查看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

clipboard

2. scale 3个

kubectl scale --replicas=3 deployments.apps/deployment-nginx

clipboard

3. 查看位于不同节点的pod 能否基于端口通信

查看3个pod的地址,条算任意一个进去

clipboard

kubectl exec -it deployment-nginx-7fd9bb74cc-9f68b -- sh

验证内网:

clipboard

验证外网:

clipboard

执行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
: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

clipboard

这里测试使用的dashboardVer: "v2.2.0"版本,也可以使用;

安装dashboard先查询兼容情况:https://github.com/kubernetes/dashboard/releases

dashboard的最新版本是v2.4.0兼容到k8s:1.21:

03313b1441da10e832e5d914260679d

查看dashboard的打开的端口

<P>kubectl get svc -A </P>

clipboard

网页进行登录:

查看令牌:

<P>kubectl get secret -A | grep admin </P>

clipboard

查询token

<P>kubectl describe secret -n kube-system admin-user-token-r9qtc </P>

clipboard

登录成功:

clipboard

clipboard

posted @ 2022-01-23 18:35  一束狗尾草  阅读(299)  评论(0编辑  收藏  举报