一、k8s架构安装部署
k8s架构
master 192.168.168.81 docker、kubeadm、kubelet、kubectl、flannel
node01 192.168.168.82 docker kubeadm kubelet kubectl flannel
node02 192.168.168.83 docker、kubeadm、kubelet、kubectl、flannel
#关闭防火墙
[root@k8s1 ~]# systemctl stop firewalld
[root@k8s1 ~]# setenforce 0
[root@k8s1 ~]# iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X ##清空防护墙策略
##永久关闭交换分区
[root@k8s1 ~]# swapoff -a
[root@k8s1 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@k8s1 ~]# for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
[root@k8s1 ~]# date
#根据规划设置主机名
--------------单独操作------------
[root@k8s1 ~]# hostnamectl set-hostname master01
[root@k8s2 ~]# hostnamectl set-hostname node01
[root@k8s3 ~]# hostnamectl set-hostname node02
------------------------------------------------
[root@k8s1 ~]# su
[root@master01 ~]# vim /etc/hosts ##开启主机名和ip地址映射
192.168.168.81 master01
192.168.168.82 node01
192.168.168.83 node02
#使用多行重定向调整内核参数,前2行为开启网桥模式后2行为关闭ipv6协议和开启路由转发
[root@master01 ~]# cat > /etc/sysctl.d/kubernetes.conf << EOF
> #开启网桥模式,可将网桥的流量传递给iptables链
> net.bridge.bridge-nf-call-ip6tables=1
> net.bridge.bridge-nf-call-iptables=1
> #关闭ipv6协议
> net.ipv6.conf.all.disable_ipv6=1
> net.ipv4.ip_forward=1
> EOF
#加载内核使得配置内核参数生效
[root@master01 ~]# sysctl --system
#所有节点部署docker引擎
[root@master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#添加Docker官方源,并将它设置为docker-ce.repo文件
[root@master01 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#yum安装docker-ce和docker客户端以及容器io
[root@master01 ~]# yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io
[root@master01 ~]# mkdir /etc/docker/
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://hub.littlediary.cn/"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
-------------------------第二个源-----------------
[root@master01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://docker.m.daocloud.io",
"https://ghcr.io",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker
[root@master01 ~]# systemctl enable docker
------------------可试试---------------
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker
[root@master01 ~]# systemctl enable docker
[root@master01 ~]# docker pull nginx
[root@master01 ~]# docker info | grep "Cgroup Driver"
Cgroup Driver: systemd
------------------定义源-------------
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
---------------------------------------
yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15
[root@master01 ~]# systemctl enable kubelet
##所有的组件都是以pod的运行的,必须要设置开机自启
[root@master01 ~]# kubeadm config images list --kubernetes-version 1.20.15
pause:镜像,特殊容器,这个容器的作用就是保持pod当中其他容器的运行。
创建pod,首先拉取镜像,pod当中的会有一个pause,pause会在每个pod当中创建一个网络命名空。
pod的生命周期结束,pause也随之一块退出,释放该pod的网络命名空间。
pod--------镜像----------容器nginx
pause nginx---->10.244.0.10给pod分配IP地址
coredns:域名解析
取消同步操作
------master01操作-------
[root@master01 ~]# kubeadm init \
--apiserver-advertise-address=192.168.168.81 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.15 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
------------------------以下解释---------------------
--apiserver-advertise-address=192.168.168.81 \内部通信的ip地址,指向的主,也可以用0.0.0.0表示任意主机
--image-repository registry.aliyuncs.com/google_containers \##指定镜像的仓库---》k8s组件的仓库地址
--kubernetes-version=v1.20.15 \ ##k8s的版本
--service-cidr=10.96.0.0/16 \ ##service的网段
--pod-network-cidr=10.244.0.0/16 \ ##pod分配的网段,10.244.0.0/16 flannel的默认网段。calico:192.168.0.0/16
--token-ttl=0 ##token永不过期,内部使用,不加的话,默认是一天
------------------复制到node节点上-------------
kubeadm join 192.168.168.81:6443 --token abkwa8.j2i4940m256tldrf \
--discovery-token-ca-cert-hash sha256:16a1e3ee10f8514a27089f4a3f810e26f0abe3ced94029c43d7662ded46fe3bc
-------------------------token验证-----------------
kubeadm token create --print-join-command ##重新生成token验证
[root@node01 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
##网络没有安装
镜像补充
tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live"
]
}
[root@master01 ~]# docker pull docker.io/calico/kube-controllers:v3.20.2
------------三台机器同步----------------------------
#设置节点的kubelet:
[root@master01 ~]# mkdir -p $HOME/.kube
[root@master01 ~]# cd /etc/kubernetes/
[root@master01 kubernetes]# ls
admin.conf kubelet.conf pki
controller-manager.conf manifests scheduler.conf
##admin.conf
##kubeadm为集群配置的一个具有管理员权限的认证文件,apiserver需要通过admin的认证,kubelet才能和apiserver进行交互。
[root@master01 kubernetes]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 kubernetes]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 kubernetes]# cd ~
[root@master01 ~]# cd .kube/
[root@master01 .kube]# ll
总用量 8
-rw-------. 1 root root 5570 8月 27 09:48 config
[root@master01 .kube]# systemctl restart kubelet
--------------------master01操作-------------------
[root@master01 .kube]# kubectl edit cm kube-proxy -n=kube-system
## kubectl edit(编辑) cm kube-proxy(节点上的网络代理 yaml) -n=kube-system
[root@master01 .kube]# kubectl edit cm kube-proxy -n=kube-system
mode: "ipvs"
configmap/kube-proxy edited
[root@master01 .kube]# kubectl get node
NAME STATUS ROLES AGE VERSION
master01 NotReady control-plane,master 19h v1.20.15
node01 NotReady <none> 19h v1.20.15
node02 NotReady <none> 19h v1.20.15
[root@master01 .kube]# kubectl get cs ##集群,检查集群的状态
[root@master01 .kube]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
16 - --bind-address=192.168.168.81 ##本机地址
19 #- --port=0
25 host: 192.168.168.81
39 host: 192.168.168.81
[root@master01 .kube]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
17 - --bind-address=192.168.168.81
26 #- --port=0
37 host: 192.168.168.81
51 host: 192.168.168.81
[root@master01 .kube]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
[root@master01 .kube]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7f89b7bc75-6z2pg 0/1 Pending 0 19h
coredns-7f89b7bc75-lg4gw 0/1 Pending 0 19h
etcd-master01 1/1 Running 0 19h
kube-apiserver-master01 1/1 Running 0 19h
kube-controller-manager-master01 1/1 Running 0 100s
kube-proxy-d5fnf 1/1 Running 0 19h
kube-proxy-kpvs2 1/1 Running 0 19h
kube-proxy-nrszf 1/1 Running 0 19h
kube-scheduler-master01 1/1 Running 0 97s
[root@master01 .kube]# systemctl status kubelet
[root@master01 .kube]# kubectl get pod -n kube-system
[root@master01 .kube]# systemctl status kubelet
二、k8s的网络类型:
CNI网络插件:flannel calico
2.1、k8s的三种通信方式:
1、pod内部的网络通信:
pod内部容器的通信,pod创建完成之后,集群会分配pod一个全局的唯一ip地址。所有的容器共享这个ip地址。
pod内部可以用本地通信+端口形式互相通信。
2、同一个node节点上的pod通信:
docker0网桥。同一个节点上的pod和docker的通信方式是一样的。
3、不同节点上pod之间通信。
想办法通过主机的物理网卡ip进行通信。
- ①、pod的ip地址不能冲突。
- ②、pod的ip地址要和node的ip地址进行关联。
- CNI:CNI是标准接口,用于容器在运行时调用网络插件,配置容器的网络。CNI负责设置容器的网络命名空间,ip地址,路由等网络参数。
pod的ip地址进行封装,通过node节点作为路由器,转发到其他的node节点,其他的node节点收到数据包之后解包,把数据包转发到指定的pod
2.2、Flannel插件:
让集群中不同节点创建的pod都有集群内部唯一的ip地址。(虚拟)
Flannel是一种overlay网络,overlay是一种网络虚拟化技术,在底层的物理网络基础之上创建一个逻辑的网络层。
从而实现跨节点的pod之间的通信。
2.2.1、Fannel数据转发的方式:UDP VXLAN(使用最多的模式) HOST-GW(主机模式,性能最好)
- VXLAN:基于内核进行转发
- UDP:默认方式,基于应用层转发,配置最简单,性能最差
- Host-GW:性能最好,但是配置最繁琐
ifconfig ##查看网络对应的网卡类型
- UDP:flannel.0
- vxlan:flannel.1 ----网络虚拟的网卡,给pod分配ip地址,通过arp广播找到目的mac
- vxlan vlan通过标识来实现广播的划分,不同的vlan之间可以通信。0 1 4096 2-4095 4094个vlanid
- vxlan:标识,vni数据中心进行广域网的划分,通过三层网络搭建一个虚拟的二层网络----------三层交换机
2.3、工作模式:
1、流程流向
[root@master01 opt]# ls
cni flannel.tar test
cni-plugins-linux-amd64-v0.8.6.tgz jenkins-2.396-1.1.noarch.rpm
containerd kube-flannel.yml
[root@master01 opt]# docker load < flannel.tar
777b2c648970: Loading layer 5.848MB/5.848MB
815dff9e0b57: Loading layer 11.42MB/11.42MB
2e16188127c8: Loading layer 2.267MB/2.267MB
eb738177d102: Loading layer 49.34MB/49.34MB
b613d890216c: Loading layer 5.12kB/5.12kB
8a984b390686: Loading layer 9.216kB/9.216kB
814fbd599e1f: Loading layer 7.68kB/7.68kB
Loaded image: quay.io/coreos/flannel:v0.14.0
----------------三台同步操作安装cni------------------
[root@master01 opt]# mv /opt/cni /opt/cni_bak
[root@master01 opt]# cd cni_bak/
[root@master01 cni_bak]# ls
bin
[root@master01 cni_bak]# mkdir -p /opt/cni/bin
[root@master01 cni_bak]# cd /opt/
[root@master01 opt]# ls
cni flannel.tar
cni_bak jenkins-2.396-1.1.noarch.rpm
cni-plugins-linux-amd64-v0.8.6.tgz kube-flannel.yml
containerd test
[root@master01 opt]# tar -xf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/
--------------------解压安装完成---------------------
-----------在master01更新kube-flannel.yml------------
[root@master01 opt]# kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
##查看集群的健康状态
[root@master01 opt]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
//在master节点查看节点状态
kubectl get nodes
kubectl get pods -n kube-system
[root@master01 opt]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7f89b7bc75-6z2pg 1/1 Running 0 20h
coredns-7f89b7bc75-lg4gw 1/1 Running 0 20h
etcd-master01 1/1 Running 0 20h
kube-apiserver-master01 1/1 Running 0 20h
kube-controller-manager-master01 1/1 Running 1 73m
kube-flannel-ds-48rnt 1/1 Running 0 27s
kube-flannel-ds-gsspq 1/1 Running 0 27s
kube-flannel-ds-wphvj 1/1 Running 0 27s
kube-proxy-d5fnf 1/1 Running 0 20h
kube-proxy-kpvs2 1/1 Running 0 20h
kube-proxy-nrszf 1/1 Running 0 20h
kube-scheduler-master01 1/1 Running 0 78m
[root@master01 opt]# kubectl get cs
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 20h v1.20.15
node01 Ready <none> 20h v1.20.15
node02 Ready <none> 20h v1.20.15
ifconfig##查看k8s网络
2、calico网络:
使用host主机作为路由器,使用BGP同步路由以及iptables来做网络,把host主机当作一个路由。
采用直接路由的方式实现。损耗很低,不需要修改数据包的报文,pod太多,路由表比较复杂,维护起来比较麻烦。
大集群的复杂网络模式。
calico------->veth-pair虚拟设备,一个虚拟的网卡。
一头设备连接pod的网络空间,一头连接主机的网络空间。
calico通过linux的命名空间和路由表实现容器之间的通信。
flannel插件:默认的地址是10.244.0.0/16
三种模式:UDP VXLAN HOST-GW
flannel的功能简单,不具备复杂的网络策略的配置能力。小集群或者简单的网络。
calico:BGP直接路由,路由维护,路由转发。
默认网段:192.168.0.0/16
calico是一个可以对网络进行管理的插件,具备配置复杂网络配置的能力。本身的配置比较复杂,对开发人员,运维人员要求比较高。
需要复杂配置的可以使用calico。(配置更多的网络策略。)
3、k8s的kubectl的永久table实现补齐
vim /etc/profile
source <(kubectl completion bash)
source /etc/profile
4、匿名用户赋权
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
5、利用脚本实现k8s中apiserver.crt 的使用周期
[root@master01 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not
Not Before: Aug 26 06:47:11 2024 GMT
Not After : Aug 26 06:47:11 2025 GMT
[root@master01 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text | grep Not
Not Before: Aug 26 06:47:11 2024 GMT
Not After : Aug 24 06:47:11 2034 GMT
[root@master01 opt]# ls
cni jenkins-2.396-1.1.noarch.rpm
cni_bak kube-flannel.yml
cni-plugins-linux-amd64-v0.8.6.tgz test
containerd update-kubeadm-cert.sh ##脚本
flannel.tar
[root@master01 opt]# chmod 777 update-kubeadm-cert.sh
[root@master01 opt]# ./update-kubeadm-cert.sh all
[root@master01 opt]# kubectl create deployment nginx1 --image=nginx:1.22
deployment.apps/nginx1 created
[root@master01 opt]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx1-654cb56c4-rlldr 0/1 ErrImagePull 0 11s
[root@master01 opt]# kubectl describe pod nginx1
作业
基于harbor私有仓库
k8s从私有仓库下载
1、基于docker,安装docker-compose,安装docker-harbor
----------------------------安装docker-compose-----------------------------
[root@docker1 opt]# mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
[root@docker1 opt]# chmod 777 /usr/local/bin/docker-compose
[root@docker1 opt]# docker-compose --version
Docker Compose version v2.18.0
----------------------安装docker-harbor------------------------
[root@docker1 opt]# tar -xf harbor-offline-installer-v2.8.1.tgz
[root@docker1 opt]# ls
docker-compose.yml harbor-offline-installer-v2.8.1.tgz mysql nginx php
harbor html mysql1 nhtml
[root@docker1 opt]# cd harbor/
[root@docker1 harbor]# ls
common.sh harbor.v2.8.1.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
[root@docker1 harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker1 harbor]# vim harbor.yml
5 hostname: 192.168.168.73
13 #https:
14 # https port for harbor, default is 443
15 # port: 443
34 harbor_admin_password: 123456
[root@docker1 harbor]# ./prepare
[root@docker1 harbor]# pwd
/opt/harbor
[root@docker1 harbor]# ./install.sh
上传镜像
网页新建项目:
[root@docker1 harbor]# docker tag nginx:1.22 192.168.168.71/test1/nginx:v1 ##给本地镜像打标签,不打标签,上传不了harbor仓库
[root@docker1 harbor]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.168.71 -- containerd=/run/containerd/containerd.sock ##客户端指定到服务端,从服务端获取镜像
[root@docker1 harbor]# systemctl daemon-reload ##改完配置文件进行重启
[root@docker1 harbor]# systemctl restart docker
[root@docker1 harbor]# docker login -u admin -p 123456 http://192.168.168.71
对应解决:
[root@docker1 harbor]# ./install.sh ##改完配置文件,重启docker后,进行初始化安装
[root@docker1 harbor]# docker login -u admin -p 123456 http://192.168.168.71 ##登录仓库,进行上传和下载
[root@docker1 harbor]# docker push 192.168.168.71/test1/nginx:v1 ##上传镜像nginx:v1
[root@docker1 harbor]# docker tag nginx:1.18 192.168.168.71/test1/nginx:v2 ##给镜像打标签
[root@docker1 harbor]# docker push 192.168.168.71/test1/nginx:v2 ##上传镜像nginx:v2
k8s集群下载镜像:
----------------------------三台k8s一起操作---------------------
[root@master01 ~]# vim /usr/lib/systemd/system/docker.service
13 ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.168.71 --containerd=/run/containerd/containerd.sock
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker
[root@master01 ~]# docker login -u admin -p 123456 http://192.168.168.71
-----------------------------以上做仓库指向--------------------------------------
拉取私有仓库nginx的镜像-------副本数为3
[root@master01 ~]# kubectl create deployment nginx2 --image=192.168.168.71/test1/nginx:v1 --replicas=3
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx2-59d574bd96-2rqgk 1/1 Running 0 159m
nginx2-59d574bd96-2zsvj 1/1 Running 0 159m
nginx2-59d574bd96-mf6zt 1/1 Running 0 159m
[root@master01 ~]# systemctl restart docker
[root@master01 ~]# docker login -u admin -p 123456 http://192.168.168.71
-----------------------------以上做仓库指向--------------------------------------
### 拉取私有仓库nginx的镜像-------副本数为3
[root@master01 ~]# kubectl create deployment nginx2 --image=192.168.168.71/test1/nginx:v1 --replicas=3
[root@master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx2-59d574bd96-2rqgk 1/1 Running 0 159m
nginx2-59d574bd96-2zsvj 1/1 Running 0 159m
nginx2-59d574bd96-mf6zt 1/1 Running 0 159m