Kubernetes(一)

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地址和端口进行访问,如果看到以下页面,说明集群正常运行。

相关推荐
月夕·花晨2 小时前
Gateway-过滤器
java·分布式·spring·spring cloud·微服务·gateway·sentinel
hssfscv3 小时前
JAVA学习笔记——9道综合练习习题+二维数组
java·笔记·学习
初听于你5 小时前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
小蒜学长6 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
蜀山雪松7 小时前
全网首先 Docker Compose 启动Postgresql18
运维·docker·容器
腾讯数据架构师8 小时前
大模型openai服务网关,认证,限流,接口输入输出的修正,监控等功能
云原生·kubernetes·ai平台
你的人类朋友8 小时前
【Docker】说说卷挂载与绑定挂载
后端·docker·容器
zizisuo8 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
笨蛋少年派9 小时前
JAVA基础语法
java·开发语言
Haooog9 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树