云原生k8s一键部署(ansible)
一、概述
前面我写了关于k8s环境部署的几篇文章,k8s部署还是比较麻烦的,所以是有必要考虑一键部署的方案,这里借助ansible playbook来实现k8s环境的一键部署,实现快速部署的目的。关于k8s传统部署详细过程可以参考我以下几篇文章: Kubernetes(k8s)安装以及搭建k8s-Dashboard详解
「云原生」Kubernetes(k8s)最完整版环境部署(V1.24.1)
关于Ansible的介绍可以参考我以下几篇文章: Ansible 介绍与实战操作演示
Ansible playbook 讲解与实战操作
节点信息
主机名
IP
角色
操作系统
local-168-182-110
192.168.182.110
master,ansible
centos7
local-168-182-111
192.168.182.110
master
centos7
local-168-182-112
192.168.182.110
master
centos7
local-168-182-113
192.168.182.110
node
centos7
k8s 架构图:
基于ansible部署k8s流程图:
二、Ansible 部署yum -y install epel-release yum -y install ansible ansible --version 1)开启记录日志
配置文件: /etc/ansible/ansible.cfg vi /etc/ansible/ansible.cfg # 去掉前面的"#"号 #log_path = /var/log/ansible.log ==> log_path = /var/log/ansible.log 2)去掉第一次连接ssh ask确认vi /etc/ansible/ansible.cfg # 其实就是把#去掉 # host_key_checking = False ==> host_key_checking = False 3)配置hosts
配置文件: /etc/ansible/hosts [master1] 192.168.182.110 [master2] 192.168.182.111 192.168.182.112 [node] 192.168.182.113 [k8s:children] master1 master2 node [k8s:vars] ansible_ssh_user=root ansible_ssh_pass=1331301116 ansible_ssh_port=22 # k8s 版本 k8s_version=1.23.6
测试连通性 ansible k8s -m ping
三、开始编排 ansible playbook1)创建目录mkdir -pv ./install-k8s/{init,install-docker,install-k8s,master-init,install-cni,install-ipvs,master-join,node-join,install-ingress-nginx,install-nfs-provisioner,install-harbor,install-metrics-server,uninstall-k8s}/{files,templates,vars,tasks,handlers,meta,default} 2)节点初始化准备 install-k8s/init/files/hosts 文件192.168.182.110 local-168-182-110 192.168.182.111 local-168-182-111 192.168.182.112 local-168-182-112 192.168.182.113 local-168-182-113 准备脚本 install-k8s/init/templates/init.sh ,内容如下:#!/usr/bin/env bash ### 【第一步】修改主机名 # 获取主机名 hostnamectl set-hostname $(grep `hostname -i` /tmp/hosts|awk "{print $2}") ### 【第二步】配置hosts # 先删除 for line in `cat /tmp/hosts` do sed -i "/$line/d" /etc/hosts done # 追加 cat /tmp/hosts >> /etc/hosts ### 【第三步】添加互信 # 先创建秘钥对 ssh-keygen -f ~/.ssh/id_rsa -P "" -q # 安装expect yum -y install expect -y # 批量推送公钥 for line in `cat /tmp/hosts` do ip=`echo $line|awk "{print $1}"` password={{ ansible_ssh_pass }} expect <<-EOF spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $ip expect { "(yes/no)?" { send "yes " expect "*assword:" { send "$password "} } "*assword:" { send "$password " } } expect eof EOF done ### 【第四步】时间同步 yum install chrony -y systemctl start chronyd systemctl enable chronyd chronyc sources ### 【第五步】关闭防火墙 systemctl stop firewalld systemctl disable firewalld ### 【第六步】关闭swap # 临时关闭;关闭swap主要是为了性能考虑 swapoff -a # 永久关闭 sed -ri "s/.*swap.*/#&/" /etc/fstab ### 【第七步】禁用SELinux # 临时关闭 setenforce 0 # 永久禁用 sed -i "s/^SELINUX=enforcing$/SELINUX=disabled/" /etc/selinux/config ### 【第八步】允许 iptables 检查桥接流量 sudo modprobe br_netfilter lsmod | grep br_netfilter # 先删 rm -rf /etc/modules-load.d/k8s.conf cat </etc/docker/daemon.json< /etc/yum.repos.d/kubernetes.repo << EOF [k8s] name=k8s enabled=1 gpgcheck=0 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ EOF # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库 yum install -y kubelet-{{ k8s_version }} kubeadm-{{ k8s_version }} kubectl-{{ k8s_version }} --disableexcludes=kubernetes # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务 systemctl enable --now kubelet # 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢 systemctl status kubelet # 提前下载好 docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v{{ k8s_version }} docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v{{ k8s_version }} docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v{{ k8s_version }} docker pull registry.aliyuncs.com/google_containers/kube-proxy:v{{ k8s_version }} docker pull registry.aliyuncs.com/google_containers/pause:3.6 docker pull registry.aliyuncs.com/google_containers/etcd:3.5.1-0 docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6 任务编排 install-k8s/install-k8s/tasks/main.yml - name: install k8s cp template: src="/a2020/img/data-img.jpg" data-src=install-k8s.sh dest=/tmp/install-k8s.sh - name: install k8s shell: sh /tmp/install-k8s.sh 5)k8s master节点初始化install-k8s/master-init/templates/master-init.sh #!/usr/bin/env bash # 判断是否已经初始化了 kubectl get nodes |grep -q `hostname` 1>&2 >/dev/null if [ $? -eq 0 ];then exit 0 fi ip=`hostname -i` kubeadm init --apiserver-advertise-address=$ip --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v{{ k8s_version }} --control-plane-endpoint=$ip --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 --v=5 mkdir -p $HOME/.kube rm -rf $HOME/.kube/config sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 任务编排 install-k8s/master-init/tasks/main.yml - name: k8s master init cp template: src="/a2020/img/data-img.jpg" data-src=master-init.sh dest=/tmp/master-init.sh - name: k8s master init shell: sh /tmp/master-init.sh 6)安装 CNI(flannel)install-k8s/install-cni/files/install-flannel.sh #!/usr/bin/env bash # 去掉master污点 kubectl taint nodes `hostname` node-role.kubernetes.io/master:NoSchedule- 2>/dev/null kubectl taint nodes `hostname` node.kubernetes.io/not-ready:NoSchedule- 2>/dev/null # For Kubernetes v1.17+ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml # 查看 kubectl get all -n kube-flannel # 持续检查 while true do kubectl get pods -n kube-flannel|grep -q "0/1" if [ $? -ne 0 ];then echo "flannel started" break else echo "flannel starting..." fi sleep 1 done 任务编排 install-k8s/install-cni/tasks/main.yml - name: install cni flannel cp copy: src="/a2020/img/data-img.jpg" data-src=install-flannel.sh dest=/tmp/install-flannel.sh - name: install cni flannel shell: sh /tmp/install-flannel.sh 7)master 节点加入k8s集群install-k8s/master-join/files/master-join.sh #!/usr/bin/env bash # 获取master ip,假设都是第一个节点为master # 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key,后面会用到 maser_ip=`head -1 /tmp/hosts |awk "{print $1}"` # 判断节点是否加入 ssh $maser_ip "kubectl get nodes|grep -q `hostname`" if [ $? -eq 0 ];then exit 0 fi CERT_KEY=`ssh $maser_ip "kubeadm init phase upload-certs --upload-certs|tail -1"` join_str=`ssh $maser_ip kubeadm token create --print-join-command` $( echo $join_str " --control-plane --certificate-key $CERT_KEY --v=5") # 拿到上面打印的命令在需要添加的节点上执行 # --control-plane 标志通知 kubeadm join 创建一个新的控制平面。加入master必须加这个标记 # --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密。这里的值就是上面这个命令(kubeadm init phase upload-certs --upload-certs)打印出的key。 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 去掉master污点 kubectl taint nodes `hostname` node-role.kubernetes.io/master:NoSchedule- 2>/dev/null kubectl taint nodes `hostname` node.kubernetes.io/not-ready:NoSchedule- 2>/dev/null 任务编排 install-k8s/master-join/tasks/main.yml - name: master join cp copy: src="/a2020/img/data-img.jpg" data-src=master-join.sh dest=/tmp/master-join.sh - name: master join shell: sh /tmp/master-join.sh 8)node 节点加入k8s集群install-k8s/node-join/files/node-join.sh #!/usr/bin/env bash # 获取master ip,假设都是第一个节点为master maser_ip=`head -1 /tmp/hosts |awk "{print $1}"` # 判断节点是否加入 ssh $maser_ip "kubectl get nodes|grep -q `hostname`" if [ $? -eq 0 ];then exit 0 fi CERT_KEY=`ssh $maser_ip "kubeadm init phase upload-certs --upload-certs|tail -1"` join_str=`ssh $maser_ip kubeadm token create --print-join-command` $( echo $join_str " --certificate-key $CERT_KEY --v=5") 任务编排 install-k8s/node-join/tasks/main.yml - name: node join cp copy: src="/a2020/img/data-img.jpg" data-src=node-join.yaml dest=/tmp/node-join.yaml - name: node join shell: sh /tmp/node-join.yaml 9)安装 ingress-nginxinstall-k8s/install-ingress-nginx/files/ingress-nginx.sh #!/usr/bin/env bash # wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml -O /tmp/deploy.yaml # 可以先把镜像下载,再安装 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1 kubectl apply -f /tmp/deploy.yaml 任务编排 install-k8s/install-ingress-nginx/tasks/main.yml - name: ingress-nginx deploy cp copy: src="/a2020/img/data-img.jpg" data-src=deploy.yaml dest=/tmp/deploy.yaml - name: install ingress-nginx cp copy: src="/a2020/img/data-img.jpg" data-src=ingress-nginx.sh dest=/tmp/ingress-nginx.sh - name: install ingress-nginx shell: sh /tmp/ingress-nginx.sh 10)安装 nfs 共享存储install-k8s/install-nfs-provisioner/files/nfs-provisioner.sh #!/usr/bin/env bash ### 安装helm # 下载包 wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz -O /tmp/helm-v3.7.1-linux-amd64.tar.gz # 解压压缩包 tar -xf /tmp/helm-v3.7.1-linux-amd64.tar.gz -C /root/ # 制作软连接 rm -rf /usr/local/bin/helm ln -s /root/linux-amd64/helm /usr/local/bin/helm # 判断是否已经部署 helm list -n nfs-provisioner|grep -q nfs-provisioner if [ $? -eq 0 ];then exit 0 fi ### 开始安装nfs-provisioner # 添加helm仓库源 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ #### 安装nfs yum -y install nfs-utils rpcbind # 服务端 mkdir -p /opt/nfsdata # 授权共享目录 chmod 666 /opt/nfsdata cat > /etc/exports<
男篮首战告负!但给球迷更大的感动和希望昨天晚上的亚洲杯小组赛,中国队首次出战和老对手韩国队对决,经过四局的艰苦搏杀,最后人员不整,体力不支的中国队败下阵来,收获首败!首战中国队输12分像世预赛与澳大利亚比赛的剧本基本相
输给韩国,不是中国男篮的末日宋教昌左手搂抱着突破的孙铭徽,硬是躲过了裁判的吹罚罗健儿顶开范子铭打进,头撞皮球怒目挑衅许勋毫无身体接触的进球,嘴里还在喋喋不休没有中国球迷会喜欢看到这样的场面,亚洲杯小组赛的第一
周琦或迎首秀!男篮战巴林无退路剑指大胜胡明轩需为己正名对阵双方中国男篮VS巴林男篮比赛时间7月14日21时北京时间7月14日,2022年FIBA男篮亚洲杯小组赛第二轮,中国男篮将对阵巴林男篮。小组赛首轮赛事,中国男篮8193输给了韩国
湖人要求里夫斯休息,却被他拒绝!湖人老板澄清我没有暗示老詹10天前,湖人老板珍妮巴斯在社交平台上发表过一段言论,当时她写道我想念科比。他会理解并解释所有我不被允许做的事。老实说,科比是最伟大的湖人。他对团队的理解胜过自我。也就是说,如果你
女排输意大利还是有收获世联赛是练兵场,胜负不重要,关键是发现问题并设法尽快解决问题。艾格鲁和副攻组成的意大利城墙是当今女排最强拦网组合,即使高光在线的朱婷也很难突破,李盈莹受阻很正常,但她的牵制力犹在,
孙颖莎王曼玉王艺迪全部晋级八强在刚刚结束的比赛中,王曼昱孙颖莎全部战胜对手,晋级八强。王迪也是战胜对手,晋级八强。因为陈梦退赛,所以我们这次只有三大主力会师吧,不然应该是四大主力,还是有些遗憾的。这三大主力已经
消失许久的足坛巨星!与梅西同龄的他已无人问津35岁的前足坛巨星法布雷加斯消失在球迷视野似乎已经有些年头,他上一次入选西班牙国家队还是6年前的事儿,当年的欧洲杯赛也是他最后一次亮相国际大赛。而当时的他也只不过才29岁。如今的法
男篮首战告负!但给球迷更大的感动和希望昨天晚上的亚洲杯小组赛,中国队首次出战和老对手韩国队对决,经过四局的艰苦搏杀,最后人员不整,体力不支的中国队败下阵来,收获首败!首战中国队输12分像世预赛与澳大利亚比赛的剧本基本相
输给韩国,不是中国男篮的末日宋教昌左手搂抱着突破的孙铭徽,硬是躲过了裁判的吹罚罗健儿顶开范子铭打进,头撞皮球怒目挑衅许勋毫无身体接触的进球,嘴里还在喋喋不休没有中国球迷会喜欢看到这样的场面,亚洲杯小组赛的第一
周琦或迎首秀!男篮战巴林无退路剑指大胜胡明轩需为己正名对阵双方中国男篮VS巴林男篮比赛时间7月14日21时北京时间7月14日,2022年FIBA男篮亚洲杯小组赛第二轮,中国男篮将对阵巴林男篮。小组赛首轮赛事,中国男篮8193输给了韩国
黄瓜别只知道拍,试试这样下锅炒一炒,营养更美味,方法简单快手黄瓜别只知道拍,试试这样下锅炒一炒,营养更美味,方法简单快手。夏天大家爱吃瓜了,清热解暑人人爱吃,要问我家最常吃的是什么瓜,答案是黄瓜!最最普通常见的蔬菜了,也是水果哦,可是洗洗就