文章目录

kubernetes

keburnetes特性

  1. 自我修复

​ 在节点故障时重新启动失败的容器,替换和重新创建

  1. 弹性伸缩

    使用命令、UI或者基于CPU使用情况自动快速的扩容缩容

  2. 自动部署和回滚

    k8s采用滚动更新策略更新应用

  3. 服务发现和负载均衡

    k8s为多个容器提供一个同意访问入口

  4. 机密和配置管理

    管理机密数据和应用程序配置,使用统一的配置文件传送给所有节点

  5. 存储编译

    挂载外部存储系统

  6. 批处理

​ 提供一次性人物,定时任务,满足批量数据处理

kubernetes的基础框架

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

整体部署的kubernetes环境是由一主两从,用户使用kubectl命令行经过身份认证操作master节点,master节点里有scheduler调度器去调度节点的资源选出适合创建容器的节点,将结果传给API server,在节点上创建通过API server在从节点上的代理kubelet(管理pod生命周期)进行创建容器,pod是容器的集合,外界想要访问容器需要经过系统的防火墙,通过kube-proxy4层的负载均衡,master里还有一个插件controller-manager控制器,管理节点的生命周期,etcd时序数据库可能存在在master节点,它里面用于储存整个kubernetes的数据信息。

版本

1.14 - 1.19 默认支持容器运行时:docker

1.20 - 1.23 同时支持,docker containerd (CNCF基金会的创建)

1.24 - 默认支持containerd

现阶段学习使用的时1.28版本

kubernetes的containerd部署

节点名 IP地址
k8s-master 192.168.18.132
k8s-node1 192.168.18.133
k8s-node2 192.168.18.138

所有初始化配置

升级内核
#所有节点,不做强调以下的所有操作都在所有节点
yum update -y kernel && reboot
设置主机名和hosts文件
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

cat >>/etc/hosts<<EOF
192.168.18.132 k8s-master
192.168.18.133 k8s-node01
192.168.18.138 k8s-node02
EOF

#使用ping 其他主机hostname 查看是否设置成功
安装环境包
yum -y install vim lrzsz unzip wget net-tools tree bash-completion \
conntrack ntpdate ntp ipvsadm ipset iptables \
curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
关闭防火墙和内核安全机制
systemctl disable firewalld --now

vim /etc/selinux/config
enforcing  ->  disabled

setenforce 0
关闭swap分区

启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区。

加快数据读取,防止数据被交换到swap,降低性能

#关闭持久化挂载
vim /etc/fstab
将swap的挂载信息注释

#当下关闭
swapoff -a   
关闭NetworkManager(可选)
systemctl stop NetworkManager
systemctl disable NetworkManager
调整系统内核参数
cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1                   
EOF
立即生效
sysctl --system
配置时间同步
yum -y install chrony
systemctl restart chronyd
chronyc sources -v
hwclock -s                    #将硬件时钟的时间同步到系统时钟
配置IPVS功能
yum -y install ipvsadm ipset sysstat conntrack libseccomp(在安装环境包时已安装)

#添加ipvs模块和内核模块
cat >>/etc/modules-load.d/ipvs.conf<<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4            #内核4.19以上版本设置为nf_conntrack,本虚拟机需要随使用nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF

Linux内核4.19+版本已经将nf_conntrack_ipv4更新为nf_conntrack。
nf_conntrack是Linux内核中用于连接跟踪的模块,它负责跟踪网络连接的状态,包括连接的建立、维护和终止,以及相关的网络数据包的处理。这个模块在防火墙、网络地址转换(NAT)、负载均衡等网络功能中起着重要作用。

重启服务
systemctl restart systemd-modules-load
查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 
#结果有8个,6个也合理,是因为环境干净

安装containerd

containerd 是一个高级容器运行时,又名容器管理器。简而言之,它是一个守护进程,在单个主机上管理整个容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置装载、网络等。
containerd 被设计为易于嵌入到更大的系统中。Docker 引擎使用 containerd 来运行容器。Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器。

指定 containerd 在系统启动时加载的内核模块
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
加载模块
modprobe overlay
modprobe br_netfilter
立即生效
sysctl --system
安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加 Docker 软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum clean all
yum list
查看containerd版本
yum list containerd.io --showduplicates | sort -r
安装指定版本containerd
yum -y install containerd.io-1.6.16
生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml
修改containerd配置文件
#修改containerd的驱动程序
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
#将SystemCgroup 的false 替换成 true

#修改镜像仓库地址  61行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd
查看containerd版本
ctr version
#1.6.16
镜像加速配置
vim /etc/containerd/config.toml
//145行
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"    #添加此处
  
mkdir /etc/containerd/certs.d
mkdir /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml

server = "https://docker.io"
[host."https://3aa741e7c6bf42ae924a3c0143f0e841.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub-mirror.c.163.com"]
  capabilities = ["pull","resolve","push"]

[host."https://do.nark.eu.org"]
  capabilities = ["pull","resolve","push"]

[host."https://dc.j8.work"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerproxy.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.mirrors.ustc.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.nju.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://registry.docker-cn.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub.uuuadc.top"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.anyhub.us.kg"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.jobcher.com"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.icu"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.ckyl.me"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.awsl9527.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://mirror.baidubce.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.1panel.live"]
  capabilities = ["pull","resolve","push"]
启动containerd
systemctl restart containerd
systemctl status containerd
查看containerd版本
ctr version
#1.6.16
测试下载镜像(单个节点测试即可)
ctr images pull docker.io/library/httpd:latest --hosts-dir=/etc/containerd/certs.d
查看镜像
ctr i ls

REF                            TYPE                                    DIGEST                                                                  SIZE     PLATFORMS                                                                                               LABELS 
docker.io/library/httpd:latest application/vnd.oci.image.index.v1+json sha256:4564ca7604957765bd2598e14134a1c6812067f0daddd7dc5a484431dd03832b 55.8 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x - 

安装kubernetes

安装kubeadm
#添加k8s软件源
cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

#快速建立yum缓存
yum makecache fast

#查看k8s版本
yum list kubectl --showduplicates | sort -r

#安装指定版本k8s
yum -y install kubectl-1.28.0 kubelet-1.28.0 kubeadm-1.28.0

#修改kubelet的crgoup与containerd的crgoup保持一致
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

#kubelet设置为开机自启动
systemctl daemon-reload
systemctl enable kubelet

#查看k8s版本
kubelet --version 或 kubeadm version

kubeadm:快速部署kubernetes集群的工具
kubelet:在集群中的每个节点上用来启动Pod和容器等
kubectl:负责管理kubernetes集群的命令行工具

配置crictl工具

crictl 是CRI兼容的容器运行时命令行接口,可以使用它来检查和调试kubelet节点上的容器运行时和镜像

# 设置crictl连接containerd
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

在master节点操作

主节点部署Kubernetes
#查看k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images list --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

#下载k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images pull --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

#查看k8s集群所有的镜像
[root@k8s-master ~]# crictl images ls
IMAGE                                                             TAG                 IMAGE ID            SIZE
registry.aliyuncs.com/google_containers/coredns                   v1.10.1             ead0a4a53df89       16.2MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0             73deb9a3f7025       103MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0             bb5e0dde9054c       34.6MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0             4be79c38a4bab       33.4MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0             ea1030da44aa1       24.6MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0             f6f496300a2ae       18.8MB
registry.aliyuncs.com/google_containers/pause                     3.9                 e6f1816883972       322kB
初始化集群自动开启IPVS
#创建初始化集群配置文件
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm-init.yaml

#修改初始化集群配置文件
[root@k8s-master ~]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.18.132   #12行 修改master节点ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock   #15行 修改容器进行时
  imagePullPolicy: IfNotPresent
  name: k8s-master                   #17行 修改master节点主机名
  taints:                                        #18行  注意!去掉Null
  - effect: NoSchedule               #19行 添加污点
    key: node-role.kubernetes.io/control-plane     #20行 添加
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers    #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0            #34行 修改k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16           #38行 增加pod网段
scheduler: {}

# 末尾添加
---                                  #更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---                                  #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration
cgroupDriver: systemd
初始化集群
[root@k8s-master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

#显示
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.18.132:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:2e659dbd9475682888a8bc05b01feb3c7cf93f41f2f1f5f8d4edc42ecd315bdd 
如果集群初始化失败

建议直接重做

重置处理:
1:删除kubernetes目录中所有内容
rm -rf /etc/kubernetes/*

2:删除启动端口进程
pkill -9 kubelet
pkill -9 kube-controll
pkill -9 kube-schedule

3:重置sock文件
kubeadm reset -f --cri-socket=unix:///var/run/containerd/containerd.sock

----------------------------------------------------------------------------------


# 查看 kube-proxy 代理模式
curl localhost:10249/proxyMode

# 注意:k8s集群初始化失败,查看日志解决
journalctl -xeu kubelet 或 tail kubeadm-init.log
配置kubectl工具(初始化成功后的步骤)
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubelet申请api-server颁发证书,证书有可能会过期,过期后需要重新申请证书

用户管理kubernetes需要先进行身份认证,认证的信息都在admin.conf里,持久性管理需要添加环境变量

将该信息export KUBECONFIG=/etc/kubernetes/admin.conf添加到~/.bash_profile文件里

admin.conf 认证,指向master地址,方便和api-server通信

#永久生效(推荐)
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source  ~/.bash_profil
查看组建状态
[root@k8s-master ~]# 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   ok

node工作节点操作

node工作节点加入集群
[root@k8s-node01 ~]# kubeadm join 192.168.18.132:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:2e659dbd9475682888a8bc05b01feb3c7cf93f41f2f1f5f8d4edc42ecd315bdd

[root@k8s-node02 ~]# kubeadm join 192.168.18.132:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:2e659dbd9475682888a8bc05b01feb3c7cf93f41f2f1f5f8d4edc42ecd315bdd
查看集群节点状态
[root@k8s-master .kube]# kubectl get nodes
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   18m   v1.28.0
k8s-node01   NotReady   <none>          82s   v1.28.0
k8s-node02   NotReady   <none>          5s    v1.28.0

部署网络CNI组建

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择 Calico。
calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做为一个路由器(router),每个pod都是虚拟路由器下的的终端,各节点通过BGP(Border Gateway Protocol) 边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来进行通信,是目前Kubernetes主流的网络方案。
官方下载地址:https://docs.tigera.io/calico
Github访问地址:https://github.com/projectcalico/calico
calico.yaml文件每个版本都有区别的,需要满足对应的k8s 版本
参考:https://archive-os-3-25.netlify.app/calico/3.25/getting-started/kubernetes/requirements
calico 3.25 版本对应的K8S版本有 v1.23—v1.28

下载Calico文件
[root@k8s-master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改Calico文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"
部署Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
[root@k8s-master ~]# kubectl get pods -A

#实时监控
[root@k8s-master ~]# watch kubectl get pods -A
#直到都运行,如果前面的步骤都对,这步出现镜像拉取失败,可以更换镜像加速器重试

#查看节点状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE    VERSION
k8s-master   Ready    control-plane   116m   v1.28.0
k8s-node01   Ready    <none>          115m   v1.28.0
k8s-node02   Ready    <none>          115m   v1.28.0

设置补全工具(所有节点)

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion 
echo "source <(kubectl completion bash)" >> ~/.bashrc
source  ~/.bashrc

测试

[root@k8s-master ~]# kubectl get pods -n kube-system 
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-mnchq   1/1     Running   0          116m
calico-node-2fqjf                          1/1     Running   0          116m
calico-node-6p5td                          1/1     Running   0          116m
calico-node-smppm                          1/1     Running   0          116m
coredns-66f779496c-8f4g2                   1/1     Running   0          120m
coredns-66f779496c-gqzk9                   1/1     Running   0          120m
etcd-k8s-master                            1/1     Running   0          120m
kube-apiserver-k8s-master                  1/1     Running   0          121m
kube-controller-manager-k8s-master         1/1     Running   0          120m
kube-proxy-4cdj9                           1/1     Running   0          119m
kube-proxy-9gtbd                           1/1     Running   0          119m
kube-proxy-wldnf                           1/1     Running   0          120m
kube-scheduler-k8s-master                  1/1     Running   0          121m

#创建pods
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3
deployment.apps/nginx created

#在节点上查看是否pull nginx镜像
[root@k8s-node01 ~]# crictl image ls
IMAGE                                                TAG                 IMAGE ID            SIZE
docker.io/calico/cni                                 v3.25.0             d70a5947d57e5       88MB
docker.io/calico/node                                v3.25.0             08616d26b8e74       87.2MB
docker.io/library/nginx                              latest              4af177a024eb8       62.9MB
registry.aliyuncs.com/google_containers/kube-proxy   v1.28.0             ea1030da44aa1       24.6MB
registry.aliyuncs.com/google_containers/pause        3.9                 e6f1816883972       322kB

[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
nginx-7854ff8877-bbzft   1/1     Running   0          16m   10.244.85.194   k8s-node01   <none>           <none>
nginx-7854ff8877-fxn84   1/1     Running   0          16m   10.244.58.196   k8s-node02   <none>           <none>
nginx-7854ff8877-s29m9   1/1     Running   0          16m   10.244.85.193   k8s-node01   <none>           <none>

[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --target-port=80
service/nginx exposed
[root@k8s-master ~]# kubectl get svc 
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   144m
nginx        ClusterIP   10.100.56.143   <none>        80/TCP    5s
[root@k8s-master ~]# kubectl get endpoints
NAME         ENDPOINTS                                            AGE
kubernetes   192.168.18.132:6443                                  144m
nginx        10.244.58.196:80,10.244.85.193:80,10.244.85.194:80   9s

通过https的协议管理k8s集群 https://192.168.18.132:6443

kubernetes的docker部署

前置环境部署

没有特别标明是在所有节点上部署

主机配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安装环境包
[root@master ~ 15:17:54]# yum -y install vim lrzsz unzip wget net-tools tree bash-completion conntrack ntpdate ntp ipvsadm ipset iptables curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置主机名解析
[root@master ~ 15:21:34]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.18.128 master
192.168.18.129 node1
192.168.18.136 node2
关闭防火墙和内核安全机制
[root@master ~ 15:21:51]# systemctl disable firewalld --now
[root@master ~ 15:23:02]# sed -i 's/enforcing/disabled/g' /etc/selinux/config
[root@master ~ 15:23:11]# setenforce 0
关闭swap分区
#注释交换空间的持久化挂载
[root@master ~ 15:23:18]# vim /etc/fstab 
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@master ~ 15:23:52]# swapoff -a
关闭NetworkManager(可选)
systemctl stop NetworkManager
systemctl disable NetworkManager
调整系统内核参数(先升级内核)
#升级内核
[root@master ~ 15:24:24]# yum update -y kernel && reboot

[root@master ~ 15:26:58]# cat >/etc/sysctl.d/kubernetes.conf<<EOF
> # 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时
> 进行网络包过滤
> net.bridge.bridge-nf-call-iptables=1     
> net.bridge.bridge-nf-call-ip6tables=1
> # 开启路由转发,转发IPv4的数据包
> net.ipv4.ip_forward=1
> # 尽可能避免使用交换分区,提升k8s性能
> vm.swappiness=0
> # 不检查物理内存是否够用
> vm.overcommit_memory=1                   
> EOF

立即生效

[root@master ~ 15:28:01]# sysctl --system
调整Linux资源限制(可选)
//设置一个进程可以打开的最大文件句柄数
[root@master ~]# ulimit -SHn 65535
//在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
[root@master ~]# cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited      
EOF
时间同步
[root@master ~ 15:28:43]# systemctl restart chronyd
[root@master ~ 15:28:49]# chronyc sources -v
[root@master ~ 15:28:55]# hwclock -s
IPVS功能
[root@master ~ 15:29:02]# cat >>/etc/modules-load.d/ipvs.conf<<EOF 
> ip_vs
> ip_vs_rr
> ip_vs_wrr
> ip_vs_sh
> nf_conntrack
> ip_tables
> ip_set
> xt_set
> ipt_set
> ipt_rpfilter
> ipt_REJECT
> ipip
> overlay
> br_netfilter
> EOF

IPVS内核模块功能说明

  1. IPVS 核心模块

    • ip_vs :IPVS 负载均衡基础模块
    • ip_vs_rr :轮询(Round Robin)调度算法
    • ip_vs_wrr :加权轮询(Weighted RR)调度算法
    • ip_vs_sh :源地址哈希(Source Hashing)调度算法
  2. 网络连接与过滤

    • nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并至 n f_conntrack )
    • ip_tables :iptables 基础框架
    • ipt_REJECT :实现数据包拒绝(REJECT 动作)
  3. IP 集合管理

    • ip_set :IP 地址集合管理
    • xt_set & 4. 网络隧道与桥接 ipt_set :iptables 与 IP 集合的扩展匹配
  4. 网络隧道与桥接

    • ipip :IP-over-IP 隧道协议
    • overlay :Overlay 网络支持(如 Docker 跨主机网络)
    • br_netfilter :桥接网络流量过滤 (需配合 net.bridge.bridge-nf-ca11-iptables=1参数)
  5. 反向路径过滤

    • ipt_rpfilter :反向路径验证(防 IP 欺骗)

典型应用场景

  • Kubernetes 节点初始化 :IPVS 模式 kube-proxy 依赖这些模块
  • 负载均衡服务器 :启用 IPVS 调度算法
  • 容器网络配置 :Overlay 和桥接模块支持

重启服务

[root@master ~ 15:30:03]# systemctl restart systemd-modules-load

查看内核模块

[root@master ~ 15:30:17]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          143411  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

docker-ce环境

前置环境安装
[root@master ~ 15:30:22]# yum install -y yum-utils device-mapper-persistent-data lvm2

说明:

yum-utils 提供了 yum-config-manager

device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理 的块设备驱动提供了一个高度模块化的内核架构。

使用阿里云镜像
[root@master ~ 15:35:16]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker-ce
[root@master ~ 15:37:52]# yum install -y docker-ce 
防火墙设置(已操作)
启动docker服务
[root@master ~ 15:37:52]# systemctl enable --now docker
镜像加速
[root@master ~ 15:38:16]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": [
>         "https://3aa741e7c6bf42ae924a3c0143f0e841.mirror.swr.myhuaweicloud.com",
>         "https://do.nark.eu.org",
>         "https://dc.j8.work",
>         "https://docker.m.daocloud.io",
>         "https://dockerproxy.com",
>         "https://docker.mirrors.ustc.edu.cn",
>         "https://docker.nju.edu.cn",
>         "https://registry.docker-cn.com",
>         "https://hub-mirror.c.163.com",
>         "https://hub.uuuadc.top",
>         "https://docker.anyhub.us.kg",
>         "https://dockerhub.jobcher.com",
>         "https://dockerhub.icu",
>         "https://docker.ckyl.me",
>         "https://docker.awsl9527.cn",
>         "https://mirror.baidubce.com",
>         "https://docker.1panel.live"
>         ]
> }
> EOF
修改cgroup方式
[root@master ~ 15:41:59]# vim /etc/docker/daemon.json 
[root@master ~ 15:44:15]# cat /etc/docker/daemon.json
{
  "registry-mirrors": [
        "https://3aa741e7c6bf42ae924a3c0143f0e841.mirror.swr.myhuaweicloud.com",
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn",
        "https://registry.docker-cn.com",
        "https://hub-mirror.c.163.com",
        "https://hub.uuuadc.top",
        "https://docker.anyhub.us.kg",
        "https://dockerhub.jobcher.com",
        "https://dockerhub.icu",
        "https://docker.ckyl.me",
        "https://docker.awsl9527.cn",
        "https://mirror.baidubce.com",
        "https://docker.1panel.live"
        ],
  "exec-opts": ["native.cgroupdriver=systemd"]   #添加cgroup方式
}

#重启服务
[root@master ~ 15:44:24]# systemctl daemon-reload
[root@master ~ 15:45:14]# systemctl restart docker
cri-dockerd安装

作用:cri-dockerd 的主要作用是为 Docker Engine 提供一个符合 Kubernetes CRI(Container Runtime Interface)标准的接口 ,使 Docker 能继续作为 Kubernetes 的容器运行时(Container Runtime),尤其是在 Kubernetes1.24版本后,官方移除对原生 Docker 支持(dockershim)之后。

[root@master ~ 15:45:20]# wget https://github.com/mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm 

下载完成后直接安装

[root@master ~ 15:47:37]# rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm 

编辑服务配置文件

[root@master ~ 15:48:16]# vim /usr/lib/systemd/system/cri-docker.service 
 //编辑第10行,中间添加  
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://

启动cri-dockerd服务

[root@master ~ 16:06:08]# systemctl daemon-reload
[root@master ~ 16:06:17]# systemctl start cri-docker.service
[root@master ~ 16:06:24]# systemctl enable cri-docker.service

检查文件是否启动

[root@master ~ 16:06:29]# ls /run/cri-*
/run/cri-dockerd.sock

kubernetes集群部署

Yum源
[root@master ~ 16:07:19]# cat <<EOF>/etc/yum.repos.d/kubernetes.repo
> [kubernetes]
> name=Kubernetes
> baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
> enabled=1
> gpgcheck=0
> repo_gpgcheck=0
> gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
> http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
> EOF
软件安装

查看可以安装的版本

[root@master ~ 16:08:20]# yum list kubeadm.x86_64 --showduplicates | sort -r

安装1.28.2-0版本

[root@master ~ 16:09:03]# yum install -y kubeadm-1.28.0-0 kubelet-1.28.0-0 kubectl-1.28.0-0
kubelet配置

强制指定 kubelet 使用 systemd 作为 cgroup 驱动,确保与 Docker 或其他容器运行时保持一致 将 kube-proxy 的代理模式设置为 ipvs ,替代默认的 iptables ,提升大规模集群的网络性能

[root@master ~ 16:11:48]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
//因为没有初始化产生对应配置文件,我们先设置开机自启动状态
[root@master ~ 16:11:54]# systemctl daemon-reload
[root@master ~ 16:12:21]# systemctl enable kubelet.service
集群初始化

只在master节点上面做

查看可使用镜像

[root@master ~ 16:12:27]# kubeadm config images list --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1

镜像下载

[root@master ~ 16:13:54]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock --kubernetes-version=v1.28.0 --image-repository=registry.aliyuncs.com/google_containers

#查看已经下载镜像
[root@master ~ 16:17:28]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED       SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0   bb5e0dde9054   2 years ago   126MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0   4be79c38a4ba   2 years ago   122MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0   f6f496300a2a   2 years ago   60.1MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0   ea1030da44aa   2 years ago   73.1MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0   73deb9a3f702   2 years ago   294MB
registry.aliyuncs.com/google_containers/coredns                   v1.10.1   ead0a4a53df8   2 years ago   53.6MB
registry.aliyuncs.com/google_containers/pause                     3.9       e6f181688397   3 years ago   744kB

创建初始化集群配置文件

[root@master ~ 16:22:54]# kubeadm config print init-defaults > kubeadm-init.yaml

修改初始化配置文件

[root@master ~ 16:22:54]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.18.128   #12行 master的IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock   #15行 修改docker运行时
  imagePullPolicy: IfNotPresent
  name: master              #17行   修改master节点主机名
  taints:                   #18行  去掉 Null
  - effect: NoSchedule      #19行  添加污点
    key: node-role.kubernetes.io/control-plane   #20行  添加
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers   #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0    #34行  k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16     #38行   增加Pod网段
scheduler: {}
---               #末尾添加  更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---           #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

初始化完成

[root@master ~ 16:23:49]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
#显示
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
`注意:`
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:
`注意:`
  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:
`注意:`
kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:094e58183b48510b522f94eb4827049786a29b09f3fcb4e5a6de2f07936f7e54 

初始化失败和containerd的方法相同

配置kubectl工具

根据初始化成功后的提示进行配置

Kubectl 是一个用于操作Kubernetes集群的命令行工具。 kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境 变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

[root@master ~ 16:26:01]# mkdir -p $HOME/.kube
[root@master ~ 16:26:31]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~ 16:26:31]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文 件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。

#持久生效
[root@master ~ 16:26:31]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master ~ 16:27:19]# source ~/.bash_profile

#查看核心组建控制平面的健康状态
[root@master ~ 16:27:27]# 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   ok 

核心组建控制平面的健康状态

⚠只在node节点操作

⚠注意:添加–cri-socket unix:///var/run/cri-dockerd.sock,否则会报错

[root@node1 ~ 16:29:16]#kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:094e58183b48510b522f94eb4827049786a29b09f3fcb4e5a6de2f07936f7e54 --cri-socket unix:///var/run/cri-dockerd.sock
[root@node2 ~ 16:29:16]#kubeadm join 192.168.18.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:094e58183b48510b522f94eb4827049786a29b09f3fcb4e5a6de2f07936f7e54 --cri-socket unix:///var/run/cri-dockerd.sock

#查看集群状态
[root@master ~ 16:27:40]# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   4m12s   v1.28.0
node1    NotReady   <none>          66s     v1.28.0
node2    NotReady   <none>          54s     v1.28.0

网络CNI组建部署

下载Calico文件
[root@master ~ 16:30:10]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改Calico文件
[root@master ~ 16:35:04]# vim calico.yaml
 # 找到4601行,去掉注释并修改
 - name: CALICO_IPV4POOL_CIDR
 value: "10.244.0.0/16"
部署Calico
[root@master ~ 16:35:04]# kubectl apply -f calico.yaml

验证检查集群

[root@master ~ 16:45:36]# kubectl get pods -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-658d97c59c-hv65v   1/1     Running   0          9m42s
kube-system   calico-node-bgtph                          1/1     Running   0          9m42s
kube-system   calico-node-fk8tb                          1/1     Running   0          9m42s
kube-system   calico-node-x5w4t                          1/1     Running   0          9m42s
kube-system   coredns-66f779496c-cklwm                   1/1     Running   0          19m
kube-system   coredns-66f779496c-wgdfz                   1/1     Running   0          19m
kube-system   etcd-master                                1/1     Running   0          19m
kube-system   kube-apiserver-master                      1/1     Running   0          19m
kube-system   kube-controller-manager-master             1/1     Running   0          19m
kube-system   kube-proxy-4zl57                           1/1     Running   0          16m
kube-system   kube-proxy-h5sfp                           1/1     Running   0          16m
kube-system   kube-proxy-rb52m                           1/1     Running   0          19m
kube-system   kube-scheduler-master                      1/1     Running   0          19m
#动态查看变化 watch kubectl get pods -A 

如果出现长时间等待状态可以所有节点直接升级内核(解决)

查看集群node状态

[root@master ~ 16:46:44]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   20m   v1.28.0
node1    Ready    <none>          17m   v1.28.0
node2    Ready    <none>          17m   v1.28.0

kubernetes的主要文件

[root@master ~ 16:46:51]# ls /etc/kubernetes/
admin.conf #认证信息              
kubelet.conf             
pki/      #集群的证书 
manifests/    #集群核心组件的运行配置
controller-manager.conf                 
scheduler.conf           
[root@master ~ 16:46:51]# ls /etc/kubernetes/manifests/
etcd.yaml    #数据库信息                 
kube-controller-manager.yaml  #控制器信息
kube-apiserver.yaml    #api信息     
kube-scheduler.yaml    #调度器信息

查看集群地址

[root@master ~ 16:46:51]# kubectl get service -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   22m

优化操作

kubectl命令补全
[root@master ~ 16:48:42]# yum install bash-completion -y
[root@master ~ 16:49:04]# source /usr/share/bash-completion/bash_completion

[root@master ~ 16:49:10]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@master ~ 16:49:16]# source  ~/.bashrc
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐