Kubernetes(一)
Kubernetes(简称K8s)是一个开源的容器编排平台,已经成为现代云原生应用的核心技术,主要应用于对容器化应用程序的自动化部署、扩展以及管理。k8s配备了一组核心组件以及一系列功能,这些组件能够实现容器的调度、负载均衡、服务发现以及故障恢复等功能。
文章目录
- 环境初始化
- 安装Docker
- kubeadm部署k8s集群
- Nginx服务部署
环境初始化
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节点
hostnamectl hostname k8s-master
node1节点
hostnamectl hostname k8s-node1
node2节点
hostnamectl hostname k8s-node2
在全部节点添加ip地址与主机名的映射
vi /etc/hosts
192.168.235.150 k8s-master
192.168.235.151 k8s-node1
192.168.235.152 k8s-node2
关闭防火墙和selinux
分别在3个节点执行
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
设置镜像源和epel源
分别在3个节点执行
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
yum makecache
vi /etc/yum.repos.d/epel.repo
[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
yum makecache
设置时区和时间
分别在3个节点执行
timedatectl
date
设置系统最大打开文件数
分别在3个节点执行
vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nofile 65535:所有用户的软限制设置为 65535 个文件描述符,每个用户在未提升权限的情况下,最多可以同时打开 65535 个文件或网络连接。
* hard nofile 65535:所有用户的硬限制设置为 65535 个文件描述符,在不修改配置文件的情况下,用户可以提升到的最大文件描述符数量。
设置内核参数
分别在3个节点执行
vi /etc/sysctl.conf
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
sysctl -p
关闭swap
分别在3个节点执行
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
安装性能分析工具
yum install -y gcc autoconf sysstat
开启bridge过滤
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
modprobe br_netfilter && lsmod | grep br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
安装Docker
分别在3个节点执行
yum install -y yum-utils
配置阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看可用的docker版本列表
yum list docker-ce.x86_64 --showduplicates | sort -r
下载指定的版本
yum -y install docker-ce-25.0.5-1.el9
vim /etc/docker/daemon.json
更换镜像源
{
"registry-mirrors": ["https://docker.1panel.live","https://docker.rainbond.cc"]
}
下载安装cri-docker
分别在3个节点执行
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.amd64.tgz
解压文件
tar -xvf cri-dockerd-0.3.9.amd64.tgz --strip-components=1 -C /usr/local/bin/
下载cri-docker.service与cri-docker.socker文件
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
如果下载不了,自己手动建这两个文件
cd /etc/systemd/system
新建cri-docker.service文件
vim cri-docker.service
[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文件
vim cri-docker.socket
[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
启动并设置开机自启动
systemctl daemon-reload
systemctl enable cri-docker.service --now
kubeadm部署k8s集群
分别在3个节点执行
设置k8s的仓库配置信息,将镜像源换成阿里云
vim /etc/yum.repos.d/k8s.repo
[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
yum install -y kubelet kubeadm kubectl
vim /etc/sysconfig/kubelet
添加Cgoup控制组信息
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置开机自启动
systemctl enable kubelet.service
初始化集群(只在master节点运行)
kubeadm config images list
kubeadm config print init-defaults > kubeadm-config.yaml
vi kubeadm-config.yaml
只需修改以下参数
advertiseAddress: 192.168.235.150 #修改为主节点IP
name: k8s-master #修改为主节点的名称
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #修改为阿里云镜像
使用配置文件初始化
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 参数,否则报错
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
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
kubectl create -f kube-flannel.yml
再查看/run/flannel是否有subnet.env,没有的话手动建一个
vim subnet.env
FLANNEL_NETWORK=10.10.0.0/16
FLANNEL_SUBNET=10.10.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
查看集群节点的状态,如果为Ready,说明集群已经部署成功。
kubectl get nodes -o wide
Nginx服务部署
在kubernetes集群中部署一个nginx应用,看集群是否正常工作。
部署nginx
kubectl create deployment nginx --image=nginx
暴露端口,提供对外访问的服务
kubectl expose deployment nginx --port=80 --type=NodePort
查看pod和服务状态
kubectl get pods,service
可以看到service的80端口映射到主机的31948端口,所以在访问的时候需要通过主机的ip地址和端口进行访问,如果看到以下页面,说明集群正常运行。