操作系统:Kylin-Server-V10-SP3-2403
docker-ce:v20.10.24
kubernetes:v1.23.17
calico:v3.25.0
Dashboard:v2.5.1
一、主机环境配置(三台都需要操作)
1、修改主机名和字符集
192.168.21.10 k8s-master
192.168.21.11 k8s-node1
192.168.21.12 k8s-node2
hostnamectl set-hostname k8s-master #设置主机名为k8s-master
hostnamectl set-hostname k8s-node1 #设置主机名为k8s-node1
hostnamectl set-hostname k8s-node2 #设置主机名为k8s-node2
locale #查看默认字符集
echo "export LANG=en_US.UTF-8" >> /etc/profile #设置字符集
cat /etc/profile | grep -i lang #查看字符集
export LANG=en_US.UTF-8
2、添加hosts解析
vi /etc/hosts
192.168.21.10 k8s-master
192.168.21.11 k8s-node1
192.168.21.12 k8s-node2
:wq! #保存退出
3、保存yum下载的安装包
vi /etc/yum.conf #保存路径为/var/cache/yum/
keepcache=1 #添加这一行
:wq! #保存退出
4、防火墙设置
系统默认使用的是firewall作为防火墙,这里改为iptables防火墙,并清空规则。
systemctl stop firewalld.service #停止 firewalld 服务
systemctl disable firewalld.service #禁用 firewalld 服务
systemctl mask firewalld #屏蔽 firewalld 服务
systemctl stop firewalld #再次停止 firewalld 服务
yum remove firewalld -y #将 firewalld 软件包从系统中移除
yum install iptables-services -y #安装iptables
systemctl enable iptables.service #设置防火墙开机启动
iptables -F #清空规则
service iptables save #保存配置规则
systemctl restart iptables.service #重启防火墙使配置生效
cat /etc/sysconfig/iptables #查看防火墙配置文件
5、关闭selinux
sestatus #查看状态,显示disabled表示已经禁用
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config #禁用selinux
setenforce 0 #临时禁用
/usr/sbin/sestatus -v #查看selinux状态,disabled表示关闭
6、关闭swap分区
如果系统设置了swap交换分区,需要关闭
#显示 Swap 分区的详细信息,如果没有任何输出,表示当前系统没有配置 Swap 分区
swapon --show
swapoff -a #关闭
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #修改配置,禁用 Swap 分区配置
free -m #查看Swap 分区信息
7、同步系统时间
#设置服务器时区
rm -rf /etc/localtime #先删除默认的时区设置
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #替换上海/北京作为默认
vi /etc/sysconfig/clock #添加时区
Zone=Asia/Shanghai
:wq! #保存退出
timedatectl set-local-rtc 0
hwclock --systohc -u #系统时钟和硬件时钟同步,当前系统时区不为 UTC,是CST时间,所有要加-u参数
date #显示系统时间
date -s "2025-03-25 15:24:00" #修改时间
watch -n 1 date #显示实时时间
vi /etc/chrony.conf
#pool pool.ntp.org iburst iburst #注释
server ntp.aliyun.com iburst #添加源,如果有就不用再加了
:wq! #保存退出
systemctl enable chronyd #添加开机启动
systemctl restart chronyd #重启服务
chronyc sources -v #查看时间同步信息
8、升级系统内核
默认已经是高版本的内核了4.19.90-89.11.v2401.ky10.x86_64,不需要升级,安装k8s的系统至少使用3.10及以上内核
grubby --default-kernel
grub2-editenv list
uname -r
#如果需要升级内核可以参考
CentOS 升级系统内核到最新版
https://www.osyunwei.com/archives/11582.html
9、调整系统内核参数
9.1
#执行以下命令
modprobe br_netfilter
modprobe ip_vs
modprobe ip_conntrack
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
cat >> /etc/rc.d/rc.local << EOF
modprobe br_netfilter
modprobe ip_vs
modprobe ip_conntrack
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
EOF
chmod +x /etc/rc.d/rc.local
#高版本的内核nf_conntrack_ipv4被nf_conntrack替换了
9.2
vi /etc/security/limits.conf #在最后一行添加以下代码,这个值要小于fs.nr_open的值
* soft nproc unlimited
* hard nproc unlimited
* soft nofile 1000000
* hard nofile 1000000
:wq! #保存退出
9.3
vi /etc/sysctl.conf #编辑修改
net.ipv4.ip_forward = 1 #修改值为1
#添加下面的参数
fs.file-max = 65535000
fs.nr_open = 65535000
kernel.pid_max= 4194303
vm.swappiness = 0
:wq! #保存退出
/sbin/sysctl -p
#查看hard和soft限制数
ulimit -Hn
ulimit -Sn
9.4
vi /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1 #将桥接的IPv4流量传递到iptables
net.bridge.bridge-nf-call-ip6tables = 1 #将桥接的IPv6流量传递到iptables
net.bridge.bridge-nf-call-arptables=1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
net.netfilter.nf_conntrack_max = 2310720
:wq! #保存退出
sysctl -p /etc/sysctl.d/kubernetes.conf #手动加载指定文件中的内核参数配置
sysctl --system #自动加载所有内核参数配置文件
9.5开启IPVS支持
vi /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
:wq! #保存退出
#执行以下命令使配置生效
chmod 755 /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
10、安装系统依赖包
yum install -y ipset ipvsadm
yum install -y openssl-devel openssl
yum install -y gcc gcc-c++
yum install -y telnet tar iproute iproute-tc jq bzip2 tar conntrack conntrack-tools sysstat curl iptables libseccomp lrzsz git unzip vim net-tools nfs-utils wget make device-mapper-persistent-data lvm2
11、配置免密码登录
只在在k8s-master上操作就行
ssh-keygen #输入命令,按三次回车,会生成私钥和公钥
cd /root/.ssh #进入目录,会看到生成的私钥和公钥
#拷贝公钥
ssh-copy-id root@192.168.21.11 #输入192.168.21.11的root密码
ssh-copy-id root@192.168.21.12 #输入192.168.21.12的root密码
后面在master节点直接输入ssh root@192.168.21.11/12登录服务器不用再输密码。
二、安装Docker(三台都需要操作)
由于目前阿里云镜像中还没有Kylin-Server-V10-SP3-2403的Docker安装包,但是可以使用CentOS的Docker安装包,
#卸载旧版本,如果没有安装就不需要执行
yum remove docker docker-client docker-client-latest docker-latest docker-latest-logrotate docker-logrotate docker-common docker-selinux docker-engine-selinux docker-engine docker-ce-cli
rpm -qa|grep docker
2.1添加docker用户组
groupadd docker
#添加普通用户myuser到docker组和wheel组,使其具有docker命令的执行权限
#如果是root用户可以不用执行,默认就有权限
usermod -aG docker myuser
usermod -aG wheel myuser
#刷新用户组
newgrp docker
2.2下载docker安装包
docker下载地址:https://download.docker.com/linux/static/stable/x86_64/
这里使用docker-20版本:https://download.docker.com/linux/static/stable/x86_64/docker-20.10.24.tgz
Docker-Compose下载地址:https://github.com/docker/compose/releases
https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
mkdir -p /data/soft/docker #创建docker安装包存放目录
上传下载好的安装包到/data/soft/docker目录
2.3创建docker配置、启动、关闭文件
mkdir -p /data/server/docker #创建docker数据存放目录,默认目录是/var/lib/docker
mkdir -p /data/server/docker/etc #创建docker配置文件放存放目录,默认是/etc/docker/daemon.json
chmod 755 -R /data/server/docker/ #设置权限
2.4创建启动文件
vi /data/soft/docker/docker.service #编辑
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --data-root=/data/server/docker --config-file=/data/server/docker/etc/daemon.json
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
:wq! #保存退出
#Docker 17.05 及以后的版本使用 "data-root"设置目录,旧版本使用"graph": "/data/server/docker"
2.5设置daemon.json配置文件,修改默认运行模式
vi /data/soft/docker/daemon.json #注意格式缩进 { "registry-mirrors": [ "http://docker.m.daocloud.io", "http://mirror.ccs.tencentyun.com", "http://docker.rainbond.cc" ], "exec-opts": [ "native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } :wq! #保存退出
#检查 JSON 格式,确保没有多余的逗号或错误的括号
#修改Docker的Cgroup Driver配置,使其与kubelet的Cgroup Driver保持一致"exec-opts": ["native.cgroupdriver=systemd"]
2.6创建安装脚本
vi /data/soft/docker/install.sh #创建安装脚本
#!/bin/bash
echo '解压docker安装包'
cd /data/soft/docker
tar -zxvf $1
echo '将docker目录移动到/usr/bin目录下'
mv docker/* /usr/bin
echo '将docker.service 移到/usr/lib/systemd/system/ 目录'
cp docker.service /usr/lib/systemd/system/
echo '将配置文件daemon.json移到/data/server/docker/etc/目录'
cp daemon.json /data/server/docker/etc/
echo '添加文件执行权限'
chmod +x /usr/lib/systemd/system/docker.service
echo '重新加载配置文件'
systemctl daemon-reload
echo '启动docker'
systemctl start docker.service
echo '设置开机自启'
systemctl enable docker.service
echo 'docker安装成功'
:wq! #保存退出
chmod +x /data/soft/docker/install.sh #添加执行权限
说明:
在Linux系统中,/usr/bin目录是用于存放用户可执行的命令或程序的标准目录之一。
将Docker的可执行文件拷贝到/usr/bin目录下是为了方便用户在任何位置都可以直接执行Docker命令,而不需要指定完整的路径。
/usr/bin目录是用于存放系统范围的可执行文件的标准目录,包括Docker的二进制文件和其他重要组件。对此目录进行任意更改可能会导致Docker无法正常运行或引发系统稳定性问题。
2.7安装docker
cd /data/soft/docker
sh install.sh docker-20.10.24.tgz
systemctl daemon-reload #重新加载配置
systemctl restart docker.service #重启docker
docker info #检查docker镜像加速器是否配置成功
2.8测试docker是否可用
docker pull hello-world #下载一个镜像实例
docker run hello-world #运行一个镜像实例
docker images hello-world #查看该镜像的信息
docker ps -a #列出容器
docker rm 88102cb65c4f #删除容器
docker rmi hello-world:latest #删除镜像
docker info |grep "Docker Root Dir" #查看docker数据存储目录
docker info |grep "Cgrou" #查看Cgroup Driver: systemd设置是否正确
#相关检测命令
cat /data/server/docker/etc/daemon.json | jq .
systemctl daemon-reload
systemctl restart docker
docker info
docker info | grep Cgrou
2.9安装Docker-Compose
Docker-Compose是docker提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
使用Docker-Compose,我们可以通过yaml文件定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
Docker-Compose依靠Docker进行工作,必须确保已经安装了docker才能安装Docker-Compose
#拷贝Docker-Compose到/usr/bin目录
cp /data/soft/docker/docker-compose-Linux-x86_64 /usr/bin/docker-compose
#添加执行权限
chmod +x /usr/bin/docker-compose
#查看版本,Docker-Compose要和Docker的版本匹配,Docker-Compose:1.29.2可以适用于docker-ce:v20.10.24
docker-compose --version
三、安装kubectl、kubelet、kubeadm(三台机器都需要执行)
由于目前阿里云镜像中还没有Kylin-Server-V10-SP3-2403的kubernetes安装包,但是可以使用CentOS-7的安装包,
#配置yum源
vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
:wq! #保存退出
#如果之前安装了k8s,先卸载旧版本
yum -y remove kubelet kubeadm kubectl
#列出可用的k8s组件版本
yum -y list kubectl kubelet kubeadm --showduplicates
yum -y list --showduplicates kubectl kubelet kubeadm| sort -r
#安装指定版本,三个组件版本要一致
yum install -y kubectl-1.23.17-0.x86_64 kubelet-1.23.17-0.x86_64 kubeadm-1.23.17-0.x86_64
#先设置开机启动,初始化后再启动服务
systemctl enable kubelet
k8s组件说明:
1、kubectl
是与 Kubernetes 集群交互的命令行工具。
一般在管理节点上运行(通常不需要在每个节点上都安装)。
负责发送 API 请求来启动 Pod 和容器、查看资源状态、创建、删除和更新各种组件。
2、kubelet
是在每个工作节点上运行的代理。
负责管理容器和 Pods,确保它们按照预期运行。
通过与 Kubernetes API 服务器通信,报告节点和 Pod 的状态。
3、kubeadm
用于集群的初始化和管理。
帮助简化集群的安装过程,包括控制平面的设置和节点的加入。
不是一个持续运行的服务,而是一个命令行工具,用于执行集群的生命周期管理操作。
4、总结
kubectl 用于管理和交互。
kubelet 管理节点上的容器和 Pods。
kubeadm 用于集群的初始化和管理。
这一步只是安装了k8s需要的三个基本组件,要让k8s真正运行起来还需要初始化部署与这三个组件版本对应的一系列镜像
四、初始化k8s(只在k8s-master这一台执行)
#查看k8s需要的镜像列表和版本
kubeadm config images list #显示了Kubernetes v1.23.17所需的所有镜像
registry.k8s.io/kube-apiserver:v1.23.17
registry.k8s.io/kube-controller-manager:v1.23.17
registry.k8s.io/kube-scheduler:v1.23.17
registry.k8s.io/kube-proxy:v1.23.17
registry.k8s.io/pause:3.6
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.8.6
#提前使用阿里云的镜像仓库下载镜像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.17
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.23.17
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.17
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.17
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull registry.aliyuncs.com/google_containers/pause:3.6
#在k8s-master上执行初始化
kubeadm init \
--apiserver-advertise-address=0.0.0.0 \
--control-plane-endpoint=192.168.21.10:6443 \
--pod-network-cidr=10.144.0.0/16 \
--service-cidr=10.96.0.0/16 \
--kubernetes-version=v1.23.17 \
--image-repository=registry.aliyuncs.com/google_containers
#特别注意:一定要提前做好网络规划,各个组件的ip地址段不能重叠和相同,否则会导致网络冲突安装部署失败
#参数说明
1、--apiserver-advertise-address=0.0.0.0
指定 Kubernetes API 服务器的 IP 地址,0.0.0.0 表示绑定到所有可用的网络接口
如果有负载均衡 VIP,--apiserver-advertise-address 参数应该设置为该 VIP 的 IP 地址
这样,Kubernetes API 服务器将向外广播这个 VIP 地址,允许客户端通过负载均衡器访问 API 服务器
2、--control-plane-endpoint=192.168.21.10:6443
设置控制平面的端点,通常用于负载均衡。这里指定的是控制平面节点的主机名或 IP 地址
如果有负载均衡器(VIP),在 --control-plane-endpoint 参数中应该使用该 VIP 的 IP 地址或主机名
这样可以确保所有请求都会通过负载均衡器转发到后端的控制平面节点
3、--pod-network-cidr=10.144.0.0/16
指定 Pod 网络的 CIDR 范围,这是为 Kubernetes 集群中的 Pods 分配 IP 地址使用的范围
这个地址可以自定义修改,但是必须保证要和你使用的网络插件(如 Calico、Flannel)里面CIDR地址一致
不能和当前节点的内网IP地址192.168.21.10网段192.168.21.0/24网段重叠,否则会出现网络冲突
在安装kubernetes-dashboard组件的时候node工作节点和master主节点之间无法互访,导致安装失败
Calico默认的地址是192.168.0.0/16,建议修改默认地址段为10.144.0.0/16
Flanne默认的地址是10.244.0.0/16
4、--service-cidr=10.96.0.0/16
指定服务网络的 CIDR 范围,这是为 Kubernetes 服务分配 IP 地址使用的范围。在集群内部,服务会通过这个 CIDR 范围内的地址来访问
不能和当前节点的内网IP地址192.168.21.10网段192.168.21.0/24网段重叠,否则会出现网络冲突
5、--kubernetes-version=v1.23.17
指定要安装的 Kubernetes 版本,这里是 v1.23.17
6、--image-repository=registry.aliyuncs.com/google_containers
由于默认拉取镜像地址k8s.gcr.io国内无法访问,需要指定镜像仓库的地址来拉取k8s需要的镜像,这里使用的是阿里云的镜像仓库
#############
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.21.10:6443 --token l3saqi.bl6f3pidgws2nial \
--discovery-token-ca-cert-hash sha256:f8deaa841c576f7f9cc39a6d403037a3a2fd8a61ada1fadaaf34009eff65b3a7 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.21.10:6443 --token l3saqi.bl6f3pidgws2nial \
--discovery-token-ca-cert-hash sha256:f8deaa841c576f7f9cc39a6d403037a3a2fd8a61ada1fadaaf34009eff65b3a7
############
#接着继续在k8s-master上执行,配置Kubernetes的访问权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
systemctl restart kubelet #重启服务
kubectl get node
kubectl get pod --all-namespaces
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 63s v1.23.17
[root@k8s-master ~]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-d5kb8 0/1 Pending 0 56s
kube-system coredns-6d8c4cb4d-hkgfw 0/1 Pending 0 56s
kube-system etcd-k8s-master 1/1 Running 0 72s
kube-system kube-apiserver-k8s-master 1/1 Running 0 72s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 71s
kube-system kube-proxy-jv5xr 1/1 Running 0 56s
kube-system kube-scheduler-k8s-master 1/1 Running 0 72s
#这时查看节点状态为NotReady、coredns状态为Pending,是因为没有安装网络组件,我们还需要安装好网络组件才能显示为Ready和Running
#重新初始化安装的相关命令
#重新初始化主节点
kubeadm reset -f
rm -rf $HOME/.kube
#重新初始化从节点
kubeadm reset -f
rm -rf /etc/cni/
五、安装网络组件
k8s的网络组件可以选择flannel或者calico,由于calico性能比flannel高,所以我们一般使用calico
calico的版本要和k8s的版本匹配才可以,calico-v3.25.0可以适配kubernetes-v1.23.17
5.1手动拉取calico-v3.25.0需要的cni、kube-controllers、node镜像版本(三台机器都需要执行)
docker pull docker.io/calico/cni:v3.25.0
docker pull docker.io/calico/kube-controllers:v3.25.0
docker pull docker.io/calico/node:v3.25.0
#如果无法拉取可以用下面的方法,先拉取镜像再修改标签
#国内可以拉取的镜像的网站:https://docker.aityp.com/
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0 docker.io/calico/cni:v3.25.0
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/cni:v3.25.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0 docker.io/calico/kube-controllers:v3.25.0
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0 docker.io/calico/node:v3.25.0
5.2安装网络插件calico(只在k8s-master上安装)
#下载calico-v3.25.0版本的calico.yaml文件(需要科学上网)
wget https://calico-v3-25.netlify.app/archive/v3.25/manifests/calico.yaml --no-check-certificate
vi calico.yaml #取消注释
- name: CALICO_IPV4POOL_CIDR
value: "10.144.0.0/16"
- name: IP_AUTODETECTION_METHOD #添加此行
value: interface=ens160 #添加此行,指定网卡
:wq! #保存退出,注意格式保证- name 项与前后项对齐,ip地址段和--pod-network-cidr=10.144.0.0/16必须相同
#如果服务器有多个网卡需要指定正确的网卡,我这里是ens160(ip addr命令查看),否则会自动使用第一个网卡,可能会导致网络冲突部署失败
#安装calico网络组件只需要在Kubernetes主节点(k8s-master)上执行该命令,Calico会自动在集群中的其他节点上进行配置和分发
#所有节点必须要能够拉取cni、kube-controllers、node这些镜像或者是提前离线导入镜像
#后面有任何新的节点加入集群,这些新节点也必须要有这些镜像才可以部署成功
kubectl apply -f calico.yaml #部署calico,只在k8s-master上安装
kubectl get nodes #部署完成后在k8s-master上查看节点以及POD资源状态已经显示正常了
kubectl get pod -A
kubectl get pod -n kube-system
[root@k8s-master calico]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 23m v1.23.17
[root@k8s-master calico]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-64cc74d646-kt9g7 1/1 Running 0 46s
kube-system calico-node-qxljz 1/1 Running 0 46s
kube-system coredns-6d8c4cb4d-d5kb8 1/1 Running 0 23m
kube-system coredns-6d8c4cb4d-hkgfw 1/1 Running 0 23m
kube-system etcd-k8s-master 1/1 Running 0 23m
kube-system kube-apiserver-k8s-master 1/1 Running 0 23m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 23m
kube-system kube-proxy-jv5xr 1/1 Running 0 23m
kube-system kube-scheduler-k8s-master 1/1 Running 0 23m
[root@k8s-master calico]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-64cc74d646-kt9g7 1/1 Running 0 66s
calico-node-qxljz 1/1 Running 0 66s
coredns-6d8c4cb4d-d5kb8 1/1 Running 0 23m
coredns-6d8c4cb4d-hkgfw 1/1 Running 0 23m
etcd-k8s-master 1/1 Running 0 24m
kube-apiserver-k8s-master 1/1 Running 0 24m
kube-controller-manager-k8s-master 1/1 Running 0 24m
kube-proxy-jv5xr 1/1 Running 0 23m
kube-scheduler-k8s-master 1/1 Running 0 24m
[root@k8s-master calico]#
六、添加节点到集群
6.1在k8s-master上执行,查看token和sha256的值
[root@k8s-master calico]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
l3saqi.bl6f3pidgws2nial 23h 2025-03-27T09:34:12Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
[root@k8s-master calico]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der | openssl dgst -sha256 | awk '{print $2}'
writing RSA key
f8deaa841c576f7f9cc39a6d403037a3a2fd8a61ada1fadaaf34009eff65b3a7
6.2在两个节点k8s-node1和k8s-node2上分别执行
systemctl restart kubelet #重启服务
#加入集群,192.168.21.10:6443要和--control-plane-endpoint=192.168.21.10:6443设置的一致
kubeadm join 192.168.21.10:6443 --token l3saqi.bl6f3pidgws2nial \
--discovery-token-ca-cert-hash sha256:f8deaa841c576f7f9cc39a6d403037a3a2fd8a61ada1fadaaf34009eff65b3a7
6.3重启所有集群节点(三台机器都需要执行)
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
kubeadm version
kubectl version --client
kubelet --version
#在k8s-master上查看节点以及POD资源状态
kubectl get nodes
kubectl get pod -A
kubectl get pod -n kube-system
七、部署Dashboard
Dashboard是官方提供的一个UI,可用于基本管理K8s资源,Kubernetes和Dashboard的版本要对应才可以
Kubernetes version dashboard version
1.18 v2.0.0 完全支持
1.19 v2.0.4 完全支持
1.20 v2.4.0 完全支持
1.21 v2.4.0 完全支持
1.23 v2.5.0 完全支持
1.24 v2.6.0 完全支持
1.25 v2.7.0 完全支持
1.27 v3.0.0-alpha0 完全支持
1.29 kubernetes-dashboard-7.5.0 完全支持
7.1我们使用的k8s版本为1.23.17,所以要下载dashboard v2.5.1版本部署(需要科学上网)
#只在k8s-master上下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
7.2修改recommended.yaml文件
vi recommended.yaml #默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #添加此行
ports:
- port: 443
targetPort: 8443
nodePort: 30001 #添加此行
selector:
k8s-app: kubernetes-dashboard
---
:wq! #保存退出
vi recommended.yaml #修改拉取镜像的优先级为本地优先
image: kubernetesui/dashboard:v2.5.1
imagePullPolicy: IfNotPresent #修改
image: kubernetesui/metrics-scraper:v1.0.7
imagePullPolicy: IfNotPresent #添加此行
:wq! #保存退出
imagePullPolicy参数说明:
Always:每次启动 Pod 时都会尝试从镜像仓库拉取指定的镜像,这意味着无论本地是否存在该镜像,Kubernetes 都会检查远程仓库并拉取最新的镜像
IfNotPresent:只有在本地不存在该镜像时,才从远程拉取。如果本地已有相同标签的镜像,则使用本地镜像
Never:完全不从远程拉取镜像,只使用本地镜像
7.3手动拉取镜像(三台机器都需要执行)
grep image recommended.yaml #查看dashboard需要的镜像
image: kubernetesui/dashboard:v2.5.1
imagePullPolicy: IfNotPresent
image: kubernetesui/metrics-scraper:v1.0.7
imagePullPolicy: IfNotPresent
#外国的镜像无法直接下载,我们使用阿里云的镜像
#提前在所有节点下载dashboard镜像和metrics-scraper镜像,然后再修改镜像标签
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.5.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.5.1 kubernetesui/dashboard:v2.5.1
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.5.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7 kubernetesui/metrics-scraper:v1.0.7
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7
7.4运行yaml文件(只在k8s-master上安装)
kubectl delete -f recommended.yaml #删掉部署
kubectl apply -f recommended.yaml #部署
#查看容器运行状态
kubectl get all -n kubernetes-dashboard
kubectl get pod -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
7.5访问Dashboard
正常安装部署完 Kubernetes Dashboard 后,通过大多数主流浏览器(Chrome、IE、Safari、Edge)是不能正常访问的,目前只有火狐浏览器能打开
这是由于部署 Kubernetes Dashboard 时默认生成的证书有问题导致的
打开页面https://192.168.21.10:30001
鼠标点击页面的任意地方,键盘输入(不显示任何输入):thisisunsafe 回车即可正常访问
7.6在Kubernetes创建Dashboard超级管理员账户(只在k8s-master上安装)
#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount admin -n kube-system
kubectl create clusterrolebinding admin --clusterrole=cluster-admin --serviceaccount=kube-system:admin
kubectl get secret -n kube-system|grep admin
kubectl describe secret -n kube-system admin-token-v4fw7 #获取token
7.7登录Dashboard
打开页面https://192.168.21.10:30001
在页面上粘贴Token,登录成功
八、测试使用k8s集群部署服务
创建一个Nginx服务,副本数为2,并且使用镜像加速站docker.rainbond.cc来拉取镜像
#只在k8s-master上执行
docker pull nginx:latest
kubectl create deployment app-nginx --image=nginx:latest --replicas=2
#暴露端口从外部访问
kubectl expose deployment app-nginx --type=NodePort --name=nginx-service --port=80 --target-port=80
#查看端口映射
kubectl get services
nginx-service NodePort 10.96.113.136 <none> 80:30430/TCP 8s
#打开下面的页面就能访问nginx服务了
http://192.168.21.10:30430/
注意:
1.在NodePort类型的服务中,外部访问通常是通过某个特定的NodePort端口,而不是直接通过80端口
2.Kubernetes会为服务分配一个在30000到32767范围内的随机端口(或者您可以在YAML中指定,不支持命令行自定义端口)
3.外部用户需要通过Node的IP 地址和这个NodePort端口进行访问
4.直接通过80端口访问nginx-service是不可行的
5.如果您希望通过80端口访问,建议使用LoadBalancer或者Ingress
至此,k8s单master多node在线安装部署完成。



