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

相关推荐
gentle_ice42 分钟前
leetcode——排序链表(java)
java·leetcode·链表
CHANG_THE_WORLD44 分钟前
C++并发编程指南07
java·jvm·c++
RainbowSea1 小时前
六. Redis当中的“发布” 和 “订阅” 的详细讲解说明(图文并茂)
java·redis·nosql
Stanford_11061 小时前
C++中常用的排序方法之——冒泡排序
java·学习·算法·微信小程序·排序算法·微信公众平台·微信开放平台
指尖动听知识库1 小时前
嵌入式经典面试题之操作系统(一)
java·linux·服务器
是小崔啊1 小时前
Spring04 - filter和interceptor
java·spring·框架·源码
yimenren2 小时前
docker desktop使用ollama在GPU上运行deepseek r1大模型
运维·docker·容器
硕风和炜2 小时前
【LeetCode: 958. 二叉树的完全性检验 + bfs + 二叉树】
java·算法·leetcode·二叉树·bfs·宽度优先·完全二叉树
倾城璧2 小时前
Maven的单元测试
java·单元测试·maven
Blue.ztl2 小时前
菜鸟之路Day11-12一一集合进阶(四)
java·windows