ansible 通过kubadm方式搭建K8s+docker
参考文档:http://k8s.unixhot.com/kubernetes/kubeadm-install.html#test
机器环境以及基础设置:
|
主机名: kub-master-20 |
ip:192.168.1.20 |
Linux kub-master-20 3.10.0-957.el7.x86_64 |
|
主机名: kub-nodes-21 |
ip:192.168.1.21 |
Linux kub-master-20 3.10.0-957.el7.x86_64 |
|
主机名: kub-nodes-22 |
ip:192.168.1.22 |
Linux kub-master-20 3.10.0-957.el7.x86_64 |
|
主机名: kub-nodes-23 |
ip:192.168.1.23 |
Linux kub-master-20 3.10.0-957.el7.x86_64 |
设置hosts:
cat >> /etc/hosts <<eof
192.168.1.20 kub-master-20
192.168.1.21 kub-nodes-21
192.168.1.22 kub-nodes-22
192.168.1.23 kub-nodes-23
eof
关闭防火墙以及关闭selinux:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
安装配置ansible以及密钥验证:
yum install epel-release -y
yum install ansible –y
安装完毕后,修改/etc/ansible/hosts文件,设置集群ip信息,如下图:

设置完毕后,创建密钥,方便后续直接进行处理:
ssh-keygen -t rsa ##创建rsa密钥
cd /root/.ssh/ ###进入ssh存在文件夹
cat id_rsa.pub >authorized_keys ##创建私有验证文件(权限一般为600)
ssh-copy-id root@192.168.1.21 ###将公钥拷贝到其他机器,该条是给了21这台机器

设置ansible集群信息:
vim /etc/ansible/hosts,添加如下内容

创建ansible-play剧本文件,内容如下:
##安装docker源,docker-ce,启动docker
---
###设置集群
- hosts: all
remote_user: root
tasks:
###下载docker源
- name: get_url_docker_yum
get_url:
url=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dest=/etc/yum.repos.d
###安装docker-re源
- name: yum install docker-ce
yum:
name=docker-ce-19.03.9-3.el7
state=present
###安装docker-cli
- name: yum install docker-cli
yum:
name=docker-ce-cli-19.03.9-3.el7
state=present
###启动docker服务
- name: start docker service
service:
name=docker
state=started
ansible-playbook k8s+docker.yml ###anssible执行剧本, k8s+docker.yml为剧本名:

在执行的过程中,使用top命令可以看到,机器是有执行yum进程的:

集群已经按照剧本内容,执行完毕:

查看机器docker进程也是正确启动,一切正常:

补,设置docker自启动:
ansible all -m command -a "systemctl enable docker" ##推送下设置docker开机自启动

集群部署kubeadm和kubelet,kubect,ipvsadm:
Kubeadm 是一个工具,它提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 kubernetes 集群的最佳实践, kubelect是用于启动kubernetes对应的服务.
kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
ipvsadm 是Linux虚拟服务器的管理命令。 ipvsadm 是用于设置、维护和检查Linux内核中虚拟服务器列表的命令
默认情况下,Kubelet不允许所在的主机存在交换分区,后期规划的时候,可以考虑在系统安装的时候不创建交换分区,针对已经存在交换分区的可以设置忽略禁止使用Swap的限制,不然无法启动Kubelet。
vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
如果需要关闭SWAP,可以执行:
swapoff –a
下面是kubeadm+kubelet.yml,即安装相关服务的剧本:
###安装kubeadm和kubelet
---
- hosts: all
remote_user: root
tasks:
###创建kub repo源文件
- name: mkdir kubernetes.repo
file:
name: /etc/yum.repos.d/kubernetes.repo
state: touch
###添加kub repo内容
- name: add kubernetes.repo
lineinfile:
dest: /etc/yum.repos.d/kubernetes.repo
line: "[kubernetes]\nname=Kubernetes\nbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg\n"
###安装kubeadm
- name: yum install kubeadm
yum:
name: kubeadm-1.18.3
state: present
###安装kubelet
- name: yum install kubelet
yum:
name: kubelet-1.18.3
state: present
###安装kubectl
- name: yum install kubectl
yum:
name: kubectl-1.18.3
state: present
###安装ipvsadm
- name: yum install ipvsadm
yum:
name: ipvsadm
state: present

下面是修改kub和内核等相关参数的剧本(kub_change_config.yml):
###修改kub和内核等相关参数
---
- hosts: all
remote_user: root
tasks:
###默认情况下,Kubelet不允许所在的主机存在交换分区,后期规划的时候,可以考虑在系统安装的时候不创建交换分区,针对已经存在交换分区的可以设置忽略禁止使用Swap的限制,
不然无法启动Kubelet。
- name: add kubelet
lineinfile:
dest: /etc/sysconfig/kubelet
line: KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
- name: add kubelet
lineinfile:
dest: /etc/sysconfig/kubelet
line: KUBELET_EXTRA_ARGS="--fail-swap-on=false"
###创建k8s内存参数文件
- name: create k8s.conf
file:
name: /etc/sysctl.d/k8s.conf
state: touch
###设置内核参数
- name: add k8s.conf
lineinfile:
dest: /etc/sysctl.d/k8s.conf
line: "net.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\n
#net.ipv4.ip_forward = 1"
###使内核参数文件生效
- name: sysctl
command:
sysctl --system
###启动kubelet,此时kubelet是无法正常启动的,可以查看/var/log/messages有报错信息,等待执行初始化之后即可正常,为正常现象。
- name: start kubelet service
service:
name: kubelet
state: started
###设置kubelet开机自启动
- name: enable kubelte
command:
systemctl enable kubelet
###在Kubernetes集群中Kube-Proxy组件负载均衡的功能,默认使用iptables,生产环境建议使用ipvs进行负载均衡。在所有节点启用ipvs模块
- name: create ipvs.modules
file:
name: /etc/sysconfig/modules/ipvs.modules
mode: 755
state: touch
###添加ipvs.module内容
- name: add ipvs.module
lineinfile:
dest: /etc/sysconfig/modules/ipvs.modules
line: "#!/bin/bash\nmodprobe -- ip_vs\nmodprobe -- ip_vs_rr\nmodprobe -- ip_vs_wrr\nmodprobe -- ip_vs_sh\nmodprobe -- nf_conntrack_ipv4"
###加载ipvs.module
- name: source ipvs.modules
shell:
source /etc/sysconfig/modules/ipvs.modules

上面剧本执行完毕后,使用下面的命令查看下ipvs配置是否ok
ansible all -m shell -a "lsmod | grep -e ip_vs -e nf_conntrack_ipv4":

补:所有机器伤设置cgroup驱动使用systemd
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://dx5z2hy7.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
重启docker:
systemctl restart docker
初始化Matser节点(master上执行):
1.导出所有默认的配置
kubeadm config print init-defaults > kubeadm.yaml
2.修改默认的配置,修改后内容如下(###的是修改的):

3.使用修改后的配置文件进行初始化:
kubeadm init --config kubeadm.yaml \
--ignore-preflight-errors=Swap,NumCPU(###忽略开启了交换分区,以及CPU的核数小于2报错,看个人环境需求)
注:
[init]:指定版本进行初始化操作
[preflight] :初始化前的检查和下载所需要的Docker镜像文件。
[kubelet-start]:生成kubelet的配置文件”/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失败。
[certificates]:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki目录中。
[kubeconfig] :生成 KubeConfig文件,存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。
[control-plane]:使用/etc/kubernetes/manifest目录下的YAML文件,安装 Master组件。
[etcd]:使用/etc/kubernetes/manifest/etcd.yaml安装Etcd服务。
[wait-control-plane]:等待control-plan部署的Master组件启动。
[apiclient]:检查Master组件服务状态。
[uploadconfig]:更新配置
[kubelet]:使用configMap配置kubelet。
[patchnode]:更新CNI信息到Node上,通过注释的方式记录。
[mark-control-plane]:为当前节点打标签,打了角色Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
[bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
[addons]:安装附加组件CoreDNS和kube-proxy
4.初始化完毕后,按照要求去执行红框的内容, 为kubectl准备Kubeconfig文件
注:如有错误根据报错修改后,使用 kubeadm reset 进行重置所有节点,再进行初始化操作

5.使用kubectl命令查看组件状态:

6.使用kubectl获取Node信息:

部署flanne网络插件:
git clone --depth 1 https://github.com/coreos/flannel.git
cd flannel/Documentation/
vim kube-flannel.yml
修改 net-conf.json 字段的Network为:10.2.0.0/16

因为Flannel的镜像拉取速度会比较慢,可以从https://github.com/coreos/flannel/releases上获取对应版本的插件
本次是使用的flanneld-v0.12.0,下载的docker镜像导入到各节点容器中

kubectl create -f kube-flannel.yml ###已修改好的flannel,yml配置文件进行创建
kubectl get pod -n kube-system ###查看pod状态

部署Node节点:
master节点:
kubeadm token create --print-join-command ###输出增加节点的命令

根据返回的加入master节点命令,在nodes端执行
kubeadm join 192.168.1.20:6443 --token 96rkqf.6djbqp4l54cv8rwi --discovery-token-ca-cert-hash sha256:52f07679567539d0a7da5f33abe47fc68a8a30957fec3f9ab9cd03dba14cd165
注: 如果节点有交换分区,需要增加--ignore-preflight-errors=Swap
加入后使用:
kubectl get nodes ###查看节点状态

浙公网安备 33010602011771号