k8s-基于kubeasz项目二进制部署k8s集群
Posted dongzhanyi123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s-基于kubeasz项目二进制部署k8s集群相关的知识,希望对你有一定的参考价值。
注意事项
注意1:请确保各节点时区设置一致、时间同步。如果你的环境没有提供 NTP 时间同步,推荐集成安装chrony
ntpdate time1.aliyun.com && hwclock -w
注意2:在公有云上创建多主集群,请结合阅读在公有云上部署 kubeasz
注意3:建议操作系统升级到新的稳定内核,请结合阅读内核升级文档
注意4:关闭k8s集群内各个节点的swap交换分区
vim /etc/fstab
#/swapfile
注意5:k8s集群中每个master和node节点的主机名必须保持唯一性
设计架构
(9)
haproxy+keepalived配置
1、vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 600 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456
listen k8s-api-6443
bind 192.168.3.188:6443
mode tcp #此处必须为TCP,当转发请求到k8s时,会走k8s内部的https,如果配置http会造成后期无法通讯
server 192.168.3.141 192.168.3.141:6443 check inter 3s fall 3 rise 5
#server 192.168.3.142 192.168.3.142:6443 check inter 3s fall 3 rise 5
#server 192.168.3.143 192.168.3.143:6443 check inter 3s fall 3 rise 5
2、systemctl restart haproxy
3、vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables
}
vrrp_instance test {
state MASTER
interface eth0
virtual_router_id 10
priority 100
smtp_alert
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.188 dev eth0 label eth0:1
192.168.3.189 dev eth0 label eth0:2
}
}
4、systemctl restart keepalived
5、systemctl enable haproxy
6、systemctl enable keepalived
harbor配置
1、cd /usr/local/src
2、tar xf harbor-offline-installer-v1.7.6.tgz
3、apt install docker-compose -y
4、apt install docker-ce=5:18.09.9~3-0~ubuntu-bionic docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic -y
5、cd harbor/
6、vim harbor.cfg
hostname = harbor.linux.com
ui_url_protocol = https
ssl_cert = /usr/local/src/harbor/certs/harbor-ca.crt
ssl_cert_key = /usr/local/src/harbor/certs/harbor-ca.key
harbor_admin_password = 123456
7、mkdir certs
8、cd certs/
9、openssl genrsa -out /usr/local/src/harbor/certs/harbor-ca.key #生成私有key
10、touch /root/.rnd #ubuntu签发证书时,需要有此文件;签发记录
11、openssl req -x509 -new -nodes -key /usr/local/src/harbor/certs/harbor-ca.key -subj "/CN=harbor.linux.com" -days 7120 -out /usr/local/src/harbor/certs/harbor-ca.crt
#指定harbor的域名,基于私钥生成自签名证书;域名中可以有中横线,但是不能有下划线
12、cd ../
13、./install.sh #安装harbor
hosts文件
1、vim /etc/hosts #在master1节点配置一个hosts文件,解析k8s各个节点
192.168.3.141 master1
192.168.3.142 master2
192.168.3.143 master3
192.168.3.144 node1
192.168.3.145 node2
192.168.3.146 node3
192.168.3.147 etcd1
192.168.3.148 etcd2
192.168.3.149 etcd3
192.168.3.232 harbor.linux.com
ansible部署
https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall_intro.md
ansible环境部署参考
基础环境准备
每个需要ansible执行的node、master、etcd节点都需要安装python2.7,ubuntu默认只安装了python3,centos默认就是python2,不需要安装
1、apt-get install python2.7 -y
2、ln -s /usr/bin/python2.7 /usr/bin/python
3、apt install ansible -y #ansible只需在一个master节点安装即可
将master1的公钥拷贝到各个node、etcd、master节点上,以实现ansible的免秘钥认证
1、ssh-keygen #生成秘钥对儿
2、vim ssh-scp.sh #准备一个拷贝公钥到各个节点的脚本
#!/bin/bash
IP="
192.168.3.141 #master1自己本身也需要copy,master1也需要安装一些服务
192.168.3.142
192.168.3.143
192.168.3.144
192.168.3.145
192.168.3.146
192.168.3.147
192.168.3.148
192.168.3.149
"
for node in ${IP};do
sshpass -p ubuntu ssh-copy-id ${node} -o StrictHostKeyChecking=no
if [ $? = 0 ];then
echo "${node} 秘钥copy完成"
else
echo "${node} 秘钥copy失败"
fi
done
#sshpass -p 通过传递参数的方式连接对方服务器,指定对方密码,以实现非交互式连接;
-o StrictHostKeyChecking=no 第一次连接对方需要验证对方的key,此参数忽略了第一次连接对方key的校验
3、bash ssh-scp.sh
在ansible控制端编排k8s安装
在有ansible的master节点下,执行下面的操作:
1、export release=2.2.0 #需要去查看kubeasz项目,每个版本都支持哪些版本的k8s
2、curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup #下载easzup脚本
3、chmod a+x easzup
4、./easzup -D
#-D参数,下载所有kubeasz代码、二进制、离线镜像,并且整理好放入目录/etc/ansible;可以修改该脚本,下载指定版本的docker二进制,及其他组件的镜像
5、cd /etc/ansible/
6、cp example/hosts.multi-node ./hosts
#example下的文件,是为了生成ansible的hosts文件用的;hosts.multi-node 此文件是k8s多master多节点的文件
7、vim hosts #ansible会通过该文件的分组,读取到需要对哪些服务器执行哪些操作
[etcd]
192.168.3.147 NODE_NAME=etcd1 #etcd集群中,每个节点需要有一个独一无二的名称,不能重复
192.168.3.148 NODE_NAME=etcd2
192.168.3.149 NODE_NAME=etcd3
[kube-master]
192.168.3.141 #master节点
192.168.3.142
[kube-node] #node节点
192.168.3.144
192.168.3.145
[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" #指定使用的容器运行时
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="linux.local." #service的域名后缀
bin_dir="/usr/bin" #指定二进制程序路径,把安装的二进制程序存放到各个节点的/usr/bin/下
ca_dir="/etc/kubernetes/ssl" #证书路径
base_dir="/etc/ansible" #kubeasz的工作路径
8、ll /etc/ansible/bin/
#easzup脚本会把各个组件的二进制程序拷贝到此目录下,后期会把这些二进制程序,该拷到master的拷贝到master,该拷贝到node的,拷贝到node
9、ansible all -m ping #测试hosts文件中配置的各个地址通不通,以及python环境是否准备好
10、vim 01.prepare.yml #初始化配置(预处理)
- hosts:
- kube-master #对未注释的节点进行初始化配置
- kube-node
- etcd
#- ex-lb #已经提前配置好了haproxy,所以不需要对haproxy做初始化配置
#- chrony #不需要做时间同步配置
# to create CA, kubeconfig, kube-proxy.kubeconfig etc.
- hosts: localhost #在本机创建CA以及kubeconfig
roles:
- deploy #可以通过查看/etc/ansible/roles目录找到对应的操作具体做了什么
# prepare tasks for all nodes
- hosts: #对下面这些节点进行预处理
- kube-master
- kube-node
- etcd
roles:
- prepare
11、ll roles/deploy/templates/ca-csr.json.j2 #此文件定义了ca的相关信息
ll roles/deploy/defaults/main.yml #此文件定义了ca机构有效期以及签发后证书的有效期,可以自己修改
ll roles/deploy/templates #此目录下存放了k8s各个组件、admin用户以及ca的证书
#初始化各指定节点环境
1、ansible-playbook 01.prepare.yml #执行初始化环境部署到所指定的节点
#01不要来回执行,执行一次,证书与私钥就会发生改变,虽然不会影响当前k8s集群内节点,但以后添加新的节点,新节点的证书与私钥就是新的,会造成该节点连接不了k8s集群
#安装etcd集群
1、ll roles/etcd/ #想要修改etcd的配置,可以到此目录下找到想要修改的文件进行更改
ll roles/etcd/tasks/main.yml #为etcd主文件
2、ansible-playbook 02.etcd.yml #部署etcd集群到指定节点
#通过心跳检测,查看etcd是否工作正常;需要在etcd集群内的随意一个节点执行即可,不能在其他节点执行,此操作需要指定etcd的证书
3、export NODE_IPS="192.168.3.147 192.168.3.148 192.168.3.149"
4、for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint health; done
#指定etcd的API版本,etcd客户端工具路径,指定pem文件路径,指定检测为心跳检测
#部署docker二进制程序及service文件到各个master、node节点
1、cd down/
2、tar xf docker-19.03.8.tgz
#下载时指定的是docker-19.03.8版本,但是未解压,部署docker时,默认部署的不是自己指定下载版本的docker,所以需要把docker的压缩包解压,拷贝到指定目录下,ansible会把指定目录下的docker二进制程序拷贝到各个节点
3、cp docker/* /etc/ansible/bin/
4、systemctl stop containerd.service #停止本机的containerd服务,否则执行playbook时会报错
5、cd ../
6、ansible-playbook 03.docker.yml #部署docker至各个节点
#部署master节点所需要的各种组件的二进制及service文件
1、ansible-playbook 04.kube-master.yml
#部署node节点所需要的各种组件的二进制及service文件
1、vim roles/kube-node/templates/kubelet.service.j2
--pod-infra-container-image={{ SANDBOX_IMAGE }}
#会发现kubelet启动时会调用一个底层镜像,初始化pod网络,即pause镜像,如果这个镜像下载不下来,后期的容器是创建不了的
2、grep SANDBOX_IMAGE ./ -R #过滤出此变量在哪个文件中定义的
3、cat roles/kube-node/defaults/main.yml #查看镜像下载的harbor仓库地址
4、docker pull mirrorgooglecontainers/pause-amd64:3.1 #尝试该镜像能否下载
5、docker tag da86e6ba6ca1 harbor.linux.com/base-images/pause-amd64:3.1
6、docker push harbor.linux.com/base-images/pause-amd64:3.1
#将该镜像上传到自己搭建的harbor上
7、vim roles/kube-node/defaults/main.yml
#SANDBOX_IMAGE: "mirrorgooglecontainers/pause-amd64:3.1"
SANDBOX_IMAGE: "harbor.linux.com/base-images/pause-amd64:3.1"
#将原先的镜像下载地址备份一下,指定镜像的下载地址为本地的harbor
8、ansible-playbook 05.kube-node.yml #部署node节点
9、每个node节点都会安装一个haproxy,node节点想访问master,会先访问自己本机的haproxy的6443端口,再通过本机的6443端口把请求转发到后端的master上,这样当haproxy故障了,只会影响当前这个node节点,而不会影响其他节点
#部署网络组件到各个node、master节点
1、ansible-playbook 06.network.yml
2、kubectl run net-test1 --image=alpine --replicas=2 sleep 360000
#创建两个pod测试网络状态
3、kubectl exec -it net-test1-5fcc69db59-bbwn4 sh
4、ping 10.10.3.2
#测试在一个pod中,能否ping通另外一个node节点上的pod
5、ping 223.6.6.6
#测试能否ping通外网
每个node节点以及上传镜像的服务器需配置证书
每个node节点需要从harbor上拉取镜像,上传镜像的服务器需要把镜像上传到harbor,harbor配置的是https,所以访问harbor时需要有证书;使用浏览器访问时,浏览器会自动接收对方证书,但是linux服务器不会自动接收,所以需要自己把harbor的证书拷贝到各个node节点以及上传镜像的服务器上
1、mkdir /etc/docker/certs.d/harbor.linux.com -p
#将harbor的证书放到需要配置证书的每个节点的此目录下,目录名必须以harbor的域名为命名,否则连接harbor时找不到证书
2、scp 192.168.3.232:/usr/local/src/harbor/certs/harbor-ca.crt /etc/docker/certs.d/harbor.linux.com
#拷贝harbor证书
3、cp /etc/docker/certs.d/harbor.linux.com/harbor-ca.crt /opt #/etc/下的证书后期会被清理
4、vim scp-certs.sh #编写拷贝证书及hosts文件的脚本
#!/bin/bash
IP="
192.168.3.141
192.168.3.142
192.168.3.143
192.168.3.144
192.168.3.145
192.168.3.146
"
for node in ${IP};do
ssh ${node} "mkdir /etc/docker/certs.d/harbor.linux.com -p"
if [ $? = 0 ];then
echo "${node} 目录创建成功"
else
echo "${node} 目录创建失败"
fi
scp /opt/harbor-ca.crt ${node}:/etc/docker/certs.d/harbor.linux.com/
if [ $? = 0 ];then
echo "${node} 证书copy成功"
else
echo "${node} 证书copy失败"
fi
scp /etc/hosts ${node}:/etc/
echo "${node} hosts文件copy完成"
done
5、bash scp-certs.sh
注意:
如果harbor配置了证书,那么其余节点连接harbor,使用证书就可以连接harbor,就不需要修改docker的service文件,不需要配置非安全的仓库认证
以上是关于k8s-基于kubeasz项目二进制部署k8s集群的主要内容,如果未能解决你的问题,请参考以下文章
ansible + kubeasz 二进制部署K8S高可用集群方案
ansible + kubeasz 二进制部署K8S高可用集群方案
ansible + kubeasz 二进制部署K8S高可用集群方案