是容器编排管理平台,用来批量管理 Docker 这类容器,实现容器自动化部署、扩缩容、故障自愈,管理大量容器化应用。
原理
把多台服务器组成集群,划分两类角色:
Master 控制节点:集群大脑,接收用户指令,调度容器,管控集群状态
kube‑apiserver:集群入口,所有请求必经
etcd:集群数据库,保存全部集群配置数据
kube‑scheduler:调度器,决定 Pod 跑在哪台机器
kube‑controller‑manager:控制器,维持资源期望状态
Worker 工作节点:真正跑业务容器的机器
kubelet:节点代理,接收 master 指令,管理本机 Pod
kube‑proxy:网络代理,负责服务网络转发
容器运行时:docker/containerd,真正运行容器
常用名词
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
部署
一.构建harbor镜像仓库
1.部署docker本地仓库
搭建本地 docker yum 源
#httpd:apache 网页服务,用来对外提供本地 yum 源访问#createrepo:生成 yum 仓库元数据,制作本地软件源[root@harbor ~]# dnf install httpd createrepo -y[root@harbor ~]# mkdir /var/www/html/docker/ -p[root@harbor ~]# vim /etc/httpd/conf/httpd.conf
[root@harbor ~]# systemctl enable --now httpd
[root@harbor ~]# dnf install docker-ce --downloadonly --destdir /mnt/ -y
[root@harbor ~]# mv /mnt/*.rpm /var/www/html/docker/
[root@harbor ~]# createrepo -v /var/www/html/docker/
[root@harbor ~]# dnf install docker-ce -y
2.安装docker在harbor仓库节点
[root@harbor ~]# dnf install docker-ce -y[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf[root@harbor ~]# modprobe -a br_netfilter[root@harbor ~]# vim /etc/sysctl.d/docker.confnet.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1net.ipv4.ip_forward=1[root@harbor ~]# systemctl restart systemd-modules-load.service[root@harbor ~]# sysctl --system[root@harbor ~]# vim /lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd-Hfd://--containerd=/run/containerd/containerd.sock--iptables=true[root@harbor ~]# systemctl daemon-reload
2.生成key
3.编辑harbor配置文件

配置文件并检测运行
2.利用ansible剧本部署docker
[devops@harbor ansible]$vimkubernetes-devops.yml - name: devops k8s from ansible hosts: all tasks: - name: setupdockerrepo yum_repository: name:dockerdescription:dockerbaseurl: http://172.25.254.151:4444/docker#harbor ipfile:dockergpgcheck: no - name:installdockerdnf: name: docker-ce state: present - name: setup docker.service replace: path: /lib/systemd/system/docker.service regexp:"ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"replace:"ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true"- name: setupdockerregistry copy: content:|{"registry-mirrors":["https://reg.bor.org"]}dest: /etc/docker/daemon.json - name: setupdockercerts file: path: /etc/docker/certs.d/reg.bor.org state: directory - name:cpcertsfilecopy: src:"{{item.src}}"dest:"{{item.dest}}"loop: - src: /etc/docker/certs.d/reg.bor.org/ca.crt dest: /etc/docker/certs.d/reg.bor.org/ca.crt - src: /etc/docker/certs.d/reg.bor.org/ca.crt dest: /etc/pki/ca-trust/source/anchors/ca.crt - name: load module copy: dest:"{{item.dest}}"content:"{{item.value}}"loop: - dest: /etc/modules-load.d/docker_mod.conf value: br_netfilter - dest: /etc/sysctl.d/docker.conf value:|net.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1net.ipv4.ip_forward=1- name: update ca cert shell:"update-ca-trust extract;sysctl --system"- name: start services service: name:"{{item}}"state: restarted enabled:yesloop: -docker- systemd-modules-load.service[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml3.利用ansible安装cri-dockerd
[devops@harbor ansible]$vimkubernetes-devops.yml - name: devops k8s from ansible hosts: all become:yestasks: - name: setupdockerrepo yum_repository: name:dockerdescription:dockerbaseurl: http://172.25.254.151:4444/docker#harbor ipfile:dockergpgcheck: no - name:installdockerdnf: name: docker-ce state: present - name: setup docker.service replace: path: /lib/systemd/system/docker.service regexp:"ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"replace:"ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true"- name: setupdockerregistry copy: content:|{"registry-mirrors":["https://reg.bor.org"]}dest: /etc/docker/daemon.json - name: setupdockercerts file: path: /etc/docker/certs.d/reg.bor.org state: directory - name:cpcertsfilecopy: src:"{{item.src}}"dest:"{{item.dest}}"loop: - src: /etc/docker/certs.d/reg.bor.org/ca.crt dest: /etc/docker/certs.d/reg.bor.org/ca.crt - src: /etc/docker/certs.d/reg.bor.org/ca.crt dest: /etc/pki/ca-trust/source/anchors/ca.crt########################################################- name: stup cri-dockerd copy: src:"{{item.src}}"dest:"{{item.dest}}"mode:'0755'loop: - src: ./cri-dockerd/cri-dockerd dest: /usr/bin/cri-dockerd - src:"./cri-dockerd/cri-docker.service"dest:"/lib/systemd/system/cri-docker.service"- src:"./cri-dockerd/cri-docker.socket"dest:"/lib/systemd/system/cri-docker.socket"- name: update ca cert shell:"update-ca-trust extract;sysctl --system;systemctl daemon-reload"- name: start services service: name:"{{item}}"state: restarted enabled:yesloop: -docker- systemd-modules-load.service - cri-docker[devops@harbor ansible]$ ansible-playbook-iinventory kubernetes-devops.yml4.利用ansible部署k8s软件
[devops@harbor ansible]$vimkubernetes-devops.yml - name:installkubernetes from ansible hosts: all tasks: - name: setup k8s repo yum_repository: name: kubernetes description: kubernetes baseurl: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm file: kubernetes gpgcheck: no - name:installsoftwareinmaster dnf: name:"{{item}}"state: present loop: - kubeadm-1.35.7-150500.1.1 - kubelet-1.35.7-150500.1.1 - kubectl-1.35.7-150500.1.1 when: inventory_hostname=="172.25.254.150"- name:installsoftwareinworknodednf: name:"{{item}}"state: present loop: - kubeadm-1.35.7-150500.1.1 - kubelet-1.35.7-150500.1.1 when: inventory_hostname=="172.25.254.10"or inventory_hostname=="172.25.254.20"- name: setup kubectl kubeadm complication lineinfile: path: /root/.bashrc line:|source<(kubectl completionbash)source<(kubeadm completionbash)when: inventory_hostname=="172.25.254.150"- name: start kubelet service: name: kubelet state: started enabled:yes[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml#让补齐功能生效[root@k8s-master mnt]# source ~/.bashrc三.下载kubernetes集群所需镜像
四.在master中初始化kubernetes集群
在master中完成集群初始化
#每个人不一样,其他主机加入本集群的凭证kubeadmjoin172.25.254.100:6443--tokentdwjoc.8d1yw3wl4r4tm6c4\--discovery-token-ca-cert-hash sha256:6b5950ef2cdba85d6dfdb564ee90d4187fa3d341767dc9852cbdd5c9dee4f927#如果忘记[root@master ~]# kubeadm token create --print-join-commandkubeadmjoin172.25.254.150:6443--tokenuvrr1z.03m17zret5c9gg2t\--discovery-token-ca-cert-hash sha256:9ffa91849f52ea4a831243853f57b068be438867fc4b2e2f2ae78c853ac309ac#如果初始化出问题[root@master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock #可以重置集群设定添加kubernets环境变量到本机
添加node节点到本集群
#删除#kubeadm reset --force --cri-socket unix:///var/run/containerd/containerd.sockrm-rf/etc/kubernetes /var/lib/kubelet /etc/cni/net.d测试
五.安装网络插件
[root@master flannel]# vim kube-flannel.yml[root@k8s-master flannel]# grep -n image: kube-flannel.yml #要改内容所在行的位置148: image: flannel-io/flannel:v0.28.9175: image: flannel-io/flannel-cni-plugin:v1.9.1-flannel3186: image: flannel-io/flannel:v0.28.9