Kubernetes(简称K8s)是一个开源的容器编排平台,已经成为现代云原生应用的核心技术,主要应用于对容器化应用程序的自动化部署、扩展以及管理。k8s配备了一组核心组件以及一系列功能,这些组件能够实现容器的调度、负载均衡、服务发现以及故障恢复等功能。
文章目录
环境初始化
Kubernetes主要有三种部署方式,分别是kubeadm、minikube、二进制包。
- Minikube:一种能够帮助用户迅速搭建起单节点Kubernetes环境的工具。
 - Kubeadm:一种可以帮助用户快速搭建Kubernetes集群的工具。
 - 二进制包:需要从官方网站下载各个组件的二进制包,然后按照一定顺序依次进行安装,这种方式可以更加深入理解Kubernetes的各个组件原理,但是实现较麻烦。
 
本文采用第二种方式进行部署,集群中三个节点的资源分配规划。
| 主机名 | 角色 | IP | 系统 | CPU | 内存 | 
|---|---|---|---|---|---|
| k8s-master | master | 192.168.235.150 | Rocky Linux 9.5 | 2c | 4g/100g | 
| k8s-node1 | node1 | 192.168.235.151 | Rocky Linux 9.5 | 2c | 4g/100g | 
| k8s-node2 | node2 | 192.168.235.152 | Rocky Linux 9.5 | 2c | 4g/100g | 
分别在三个节点执行
master节点
            
            
              java
              
              
            
          
          hostnamectl hostname k8s-master
        node1节点
            
            
              java
              
              
            
          
          hostnamectl hostname k8s-node1
        node2节点
            
            
              java
              
              
            
          
          hostnamectl hostname k8s-node2
        在全部节点添加ip地址与主机名的映射
            
            
              java
              
              
            
          
          vi /etc/hosts
        
            
            
              java
              
              
            
          
          192.168.235.150 k8s-master
192.168.235.151 k8s-node1
192.168.235.152 k8s-node2
        
关闭防火墙和selinux
分别在3个节点执行
            
            
              java
              
              
            
          
          systemctl stop firewalld.service 
systemctl disable firewalld.service
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
        设置镜像源和epel源
分别在3个节点执行
            
            
              java
              
              
            
          
          sed -e 's|^mirrorlist=|#mirrorlist=|g' \
 -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
 -i.bak \
 /etc/yum.repos.d/rocky-*.repo
        
            
            
              java
              
              
            
          
          yum makecache
        
            
            
              java
              
              
            
          
          vi /etc/yum.repos.d/epel.repo
        
            
            
              java
              
              
            
          
          [epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/$basearch/
#metalink=https://mirrors.fedoraproject.org/#metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
 
[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/$basearch/debug/
#metalink=https://mirrors.fedoraproject.org/#metalink?repo=epel-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1
 
[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/source/tree/
#metalink=https://mirrors.fedoraproject.org/#metalink?repo=epel-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
        
            
            
              java
              
              
            
          
          yum makecache
        设置时区和时间
分别在3个节点执行
            
            
              java
              
              
            
          
          timedatectl
        
            
            
              java
              
              
            
          
          date
        
设置系统最大打开文件数
分别在3个节点执行
            
            
              java
              
              
            
          
          vi /etc/security/limits.conf
        
            
            
              java
              
              
            
          
          * soft nofile 65535
* hard nofile 65535
        * soft nofile 65535:所有用户的软限制设置为 65535 个文件描述符,每个用户在未提升权限的情况下,最多可以同时打开 65535 个文件或网络连接。
* hard nofile 65535:所有用户的硬限制设置为 65535 个文件描述符,在不修改配置文件的情况下,用户可以提升到的最大文件描述符数量。
        设置内核参数
分别在3个节点执行
            
            
              java
              
              
            
          
          vi /etc/sysctl.conf
        
            
            
              java
              
              
            
          
          net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_max_tw_buckets = 20480 
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
        
            
            
              java
              
              
            
          
          sysctl -p
        关闭swap
分别在3个节点执行
            
            
              java
              
              
            
          
          swapoff -a
        
            
            
              java
              
              
            
          
          sed -ri 's/.*swap.*/#&/' /etc/fstab
        安装性能分析工具
            
            
              java
              
              
            
          
          yum install -y gcc autoconf sysstat
        开启bridge过滤
            
            
              java
              
              
            
          
          vim /etc/sysctl.d/k8s.conf
        
            
            
              java
              
              
            
          
          net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
        
            
            
              java
              
              
            
          
          modprobe br_netfilter && lsmod | grep br_netfilter
        
            
            
              java
              
              
            
          
          sysctl -p /etc/sysctl.d/k8s.conf
        安装Docker
分别在3个节点执行
            
            
              java
              
              
            
          
          yum install -y yum-utils
        配置阿里云镜像
            
            
              java
              
              
            
          
          yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        查看可用的docker版本列表
            
            
              java
              
              
            
          
          yum list docker-ce.x86_64 --showduplicates | sort -r
        下载指定的版本
            
            
              java
              
              
            
          
          yum -y install docker-ce-25.0.5-1.el9
        
            
            
              java
              
              
            
          
          vim /etc/docker/daemon.json
        更换镜像源
            
            
              java
              
              
            
          
          {
  "registry-mirrors": ["https://docker.1panel.live","https://docker.rainbond.cc"]
}
        下载安装cri-docker
分别在3个节点执行
            
            
              java
              
              
            
          
          wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
        解压文件
            
            
              java
              
              
            
          
          tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/
        下载cri-docker.service与cri-docker.socker文件
            
            
              java
              
              
            
          
          wget -O /etc/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget -O /etc/systemd/system/cri-docker.socket https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
        如果下载不了,自己手动建这两个文件
            
            
              java
              
              
            
          
          cd /etc/systemd/system
        新建cri-docker.service文件
            
            
              java
              
              
            
          
          vim cri-docker.service
        
            
            
              java
              
              
            
          
          [Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
        新建cri-docker.socket文件
            
            
              java
              
              
            
          
          vim cri-docker.socket
        
            
            
              java
              
              
            
          
          [Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
        启动并设置开机自启动
            
            
              java
              
              
            
          
          systemctl daemon-reload
systemctl enable cri-docker.service --now
        kubeadm部署k8s集群
分别在3个节点执行
设置k8s的仓库配置信息,将镜像源换成阿里云
            
            
              java
              
              
            
          
          vim /etc/yum.repos.d/k8s.repo
        
            
            
              java
              
              
            
          
          [kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
        安装集群的组件kubelet kubeadm kubectl
            
            
              java
              
              
            
          
          yum install -y kubelet kubeadm kubectl
        
            
            
              java
              
              
            
          
          vim /etc/sysconfig/kubelet
        添加Cgoup控制组信息
            
            
              java
              
              
            
          
          KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
        设置开机自启动
            
            
              java
              
              
            
          
          systemctl enable kubelet.service
        初始化集群(只在master节点运行)
            
            
              java
              
              
            
          
          kubeadm config images list
        
            
            
              java
              
              
            
          
          kubeadm config print init-defaults > kubeadm-config.yaml
        
            
            
              java
              
              
            
          
          vi kubeadm-config.yaml
        只需修改以下参数
            
            
              java
              
              
            
          
           advertiseAddress: 192.168.235.150 #修改为主节点IP
 name: k8s-master  #修改为主节点的名称
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #修改为阿里云镜像
        使用配置文件初始化
            
            
              java
              
              
            
          
          kubeadm init --config kubeadm-config.yaml --upload-certs
        初始化完成后根据提示信息执行以下代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
        再根据提示加入其他node节点,在其他两个node节点上执行下面语句,注意需要在后面加上 --cri-socket /var/run/cri-dockerd.sock 参数,否则报错
            
            
              java
              
              
            
          
          kubeadm join 192.168.235.150:6443 --token abcdef.0123456789abcdef  --discovery-token-ca-cert-hash sha256:fedc160482922f0c5c4077121fb45ed13ca9e169f937628eda2cbfcbba99015e --cri-socket=unix:///var/run/cri-dockerd.sock
        安装网络插件flannel
            
            
              java
              
              
            
          
          wget https://github.com/flannel-io/flannel/releases/download/v0.24.3/kube-flannel.yml
sed -i '/ image:/s#docker.io/flannel#registry.cn-hangzhou.aliyuncs.com/luoyuxin#' kube-flannel.yml
        根据配置文件创建fiannel
            
            
              java
              
              
            
          
          kubectl create -f kube-flannel.yml
        再查看/run/flannel是否有subnet.env,没有的话手动建一个
            
            
              java
              
              
            
          
          vim subnet.env
        
            
            
              java
              
              
            
          
          FLANNEL_NETWORK=10.10.0.0/16
FLANNEL_SUBNET=10.10.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
        查看集群节点的状态,如果为Ready,说明集群已经部署成功。
            
            
              java
              
              
            
          
          kubectl get nodes -o wide
        
Nginx服务部署
在kubernetes集群中部署一个nginx应用,看集群是否正常工作。
部署nginx
            
            
              java
              
              
            
          
          kubectl create deployment nginx --image=nginx
        暴露端口,提供对外访问的服务
            
            
              java
              
              
            
          
          kubectl expose deployment nginx --port=80 --type=NodePort
        查看pod和服务状态
            
            
              java
              
              
            
          
          kubectl get pods,service
        
可以看到service的80端口映射到主机的31948端口,所以在访问的时候需要通过主机的ip地址和端口进行访问,如果看到以下页面,说明集群正常运行。
