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  ###查看节点状态

 

posted @ 2020-09-26 21:28  努力变强的菜鸟  阅读(591)  评论(0)    收藏  举报