大家好,今天咱们不聊虚的,就来啃一块“硬骨头”——在银河麒麟高级服务器操作系统(V10)上手动部署一套完整的Kubernetes(k8s)集群。这不是一个简单的“复制粘贴命令”教程,而是一次深度探索。我们会聊到为什么要在国产化平台上搞k8s、会遇到哪些坑、怎么填坑,以及背后的思考。如果你正在负责国产化项目、信创建设,或者单纯对k8s和国产操作系统的结合感兴趣,这篇万字长文应该能给你不少干货。

一、为什么是银河麒麟 + K8s?
1.1 时代背景:自主可控的国家战略需求
在当前全球信息技术格局深刻变革的背景下,实现关键基础设施的自主可控已成为国家战略的核心组成部分。从芯片(CPU)到操作系统(OS),再到上层应用,构建完整的、安全的、可控的国产信息技术体系至关重要。
银河麒麟高级服务器操作系统,是由中国国防科技大学研发,适配国产龙芯、飞腾、鲲鹏、海光、兆芯等CPU的Linux发行版。它满足了等保四级、国密算法等高标准安全要求,是承载国家关键领域核心应用的基石。
而Kubernetes,作为云原生时代事实上的操作系统,负责管理、编排、调度容器化应用,是现代化应用交付的引擎。将K8s部署在银河麒麟之上,意味着我们将国产化的底层基础设施与全球领先的应用管理范式相结合,从而在确保安全可控的前提下,获得极高的研发效率、运维自动化水平和资源利用率。这是一次“硬核”与“云核”的完美融合。
1.2 挑战与机遇
在非主流的Linux发行版上部署K8s,我们必然会面临一些特有的挑战:
- 软件源差异:无法直接使用Google或Docker官方的标准源,需要寻找国内镜像源或自主打包。
- 内核参数与依赖:需要对麒麟系统的内核参数、模块依赖有更深入的了解。
- 硬件适配:尤其是与国产CPU和硬件设备的兼容性调试。
- 文档稀缺:相较于CentOS/Ubuntu,社区分享的经验较少。
但正是这些挑战,赋予了本次实践极高的价值。成功部署意味着我们打通了国产化体系中至关重要的一环,为后续构建全栈国产化的云平台(如基于KubeSphere)奠定了坚实基础。
1.3什么是k8s
Kubernetes(K8s)是一个开源的容器编排系统,其核心价值在于为容器化应用提供部署、运维、扩展与管理的自动化运维框架;它通过抽象底层基础设施,将应用及其依赖以“工作负载”的形式进行声明式描述与管理,用户只需定义期望状态(如运行3个实例),Kubernetes的控制平面(Control Plane)便会持续调和实际状态至预期目标,从而实现包括服务发现、负载均衡、滚动更新、自动扩缩容以及基于健康检查的故障自愈等关键功能,大幅提升了分布式系统在云环境中的 resilience 与可管理性,成为云原生应用架构事实上的标准操作系统。
二、基础环境准备与规划
“工欲善其事,必先利其器”。一个成功的部署始于周密的规划。
2.1 集群架构规划
我们将部署一个一主两从的高可用集群。虽然单主节点在严格意义上不属于“高可用”,但通过后续的控制平面扩展,可以轻松升级为多主模式。此架构适合中小型生产环境。
- 硬件配置建议:
- Master节点: 4核CPU, 8GB+ RAM, 100GB+ 硬盘(SSD推荐)。Master节点etcd对I/O性能敏感。
- Node节点: 8核CPU+, 16GB+ RAM, 100GB+ 硬盘(视应用需求而定)。
- 网络: 所有节点必须在同一局域网内,网络延迟低且稳定。关闭防火墙或配置正确的规则是成功的关键。
- 节点信息规划:
| kylin-k8s-master | 192.168.17.246 | Master | kube-apiserver, kube-controller-manager, kube-scheduler, etcd, containerd |
| kylin-k8s-node01 | 192.168.17.247 | Node | kubelet,kube-proxy,containerd |
| kylin-k8s-node02 | 192.168.17.248 | Node | kubelet,kube-proxy,containerd |
- 操作系统环境:
[root@kylin-k8s-master ~]# nkvers
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Halberd)
Kernel:
4.19.90-89.11.v2401.ky10.x86_64
Build:
Kylin Linux Advanced Server
release V10 SP3 2403/(Halberd)-x86_64-Build20/20240426
#################################################
[root@kylin-k8s-master ~]# arch
x86_64
[root@kylin-k8s-master ~]#
2.2 系统初始化配置(所有节点执行)
以下操作请在所有三台服务器上以root用户或具有sudo权限的用户执行。
1. 设置主机名与hosts解析
# 在master上执行
hostnamectl set-hostname kylin-k8s-master
# 在node01上执行
hostnamectl set-hostname kylin-k8s-node01
# 在node02上执行
hostnamectl set-hostname kylin-k8s-node02
# 编辑所有节点的/etc/hosts文件,添加以下内容
cat >> /etc/hosts << EOF
192.168.17.246 kylin-k8s-master
192.168.17.247 kylin-k8s-node01
192.168.17.248 kylin-k8s-node02
EOF



2. 关闭并禁用防火墙
K8s需要大量端口通信,生产环境建议通过安全组控制,或学习配置firewalld规则。为简化部署,我们直接关闭。
systemctl stop firewalld
systemctl disable firewalld

3. 关闭SELinux
SELinux可能会与容器运行时和K8s组件产生权限冲突。
sestatus #查看状态,显示disabled表示已经禁用
setenforce 0 #临时禁用
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config #永久禁用selinux

4. 关闭swap交换分区
Kubernetes 1.8+要求必须关闭swap,如果系统设置了swap交换分区,需要关闭,以便kubelet正常工作。
swapon –show
# 显示 Swap 分区的详细信息,如果没有任何输出,表示当前系统没有配置 Swap 分区
swapoff -a # 关闭
sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab # 修改配置,禁用 Swap 分区配置
free -m # 查看Swap 分区信息

5.同步系统时间
date #显示系统时间
date -s "2025-08-25 15:24:00" #修改时间
watch -n 1 date #显示实时时间
vi /etc/chrony.conf
#pool pool.ntp.org iburst iburst #注释
server ntp.aliyun.com iburst #添加源,如果有就不用再加了
systemctl enable chronyd #添加开机启动
systemctl restart chronyd #重启服务
chronyc sources -v #查看时间同步信息

6. 配置内核参数并加载模块
创建 /etc/sysctl.d/k8s.conf文件,写入以下内容:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0

应用配置并加载br_netfilter模块:
modprobe br_netfilter
sysctl –system
7.安装系统依赖包
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 net-tools nfs-utils wget make lvm2 device-mapper-persistent-data
8.配置ssh免密登录
只在kylin-k8s-master上配置操作就行
ssh-keygen # 输入命令,按三次回车,会生成私钥和公钥
cd /root/.ssh/ # 进入目录,会看到生成的私钥和公钥
# 拷贝公钥
ssh-copy-id root@192.168.17.247 # 要输入192.168.17.247的root用户密码
ssh-copy-id root@192.168.17.248 # 要输入192.168.17.248的root用户密码
三、安装docker(三台都需要安装)
由于目前阿里云镜像中还没有Kylin-Server-V10-SP3-2403的Docker安装包,但是可以使用CentOS的Docker安装包。
3.1下载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目录

3.2创建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/ #设置权限
3.3创建docker启动文件
vim /usr/lib/systemd/system/docker.service
# 添加如下内容
[Unit]
Description=Docker Application Container Engine
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
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
# 添加文件执行权限
chmod +x /usr/lib/systemd/system/docker.service

3.4设置daemon.json配置文件
vim /data/server/docker/etc/daemon.json
# 添加如下内容,设置国内镜像源加速
{
"registry-mirrors": [
"http://docker.m.daocloud.io",
"http://mirror.ccs.tencentyun.com",
"http://docker.rainbond.cc"
],
"exec-opts": [ "native.cgroupdriver=systemd"]
}
# 修改Docker的Cgroup Driver配置,使其与kubelet的Cgroup Driver保持一致"exec-opts": ["native.cgroupdriver=systemd"]
修改Docker的Cgroup Driver配置,使其与kubelet的Cgroup Driver保持一致"exec-opts": [“native.cgroupdriver=systemd”],否则会出现如下错误:


3.5安装docker
# 解压docker安装包
cd /data/soft/docker && tar -zxvf docker-20.10.24.tgz
# 将docker目录移动到/usr/bin目录下面
mv docker/* /usr/bin/
3.6启动docker并设置开机自启
# 重新加载配置文件
systemctl daemon-reload
# 启动docker
systemctl start docker.service
# 设置docker开机自启
systemctl enable docker.service

3.7验证测试docker
# 查看docker相关信息
docker info
docker pull hello-world #下载一个镜像实例
# 查看镜像
docker images


3.8安装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 –version

四、安装kubectl、kubelet、kubeadm(三台主机都需要执行)
kubectl是Kubernetes的命令行工具,充当用户与API Server交互的桥梁。它通过YAML/JSON格式的声明式配置或指令式命令,实现对集群资源的全生命周期管理。其设计遵循“控制器模式”(Controller Pattern):用户向API Server提交期望状态(Desired State),kubectl将请求封装为HTTP调用,由集群内的控制器驱动实际状态向期望状态收敛。值得注意的是,kubectl并不直接操作工作节点,而是通过API Server的REST接口与集群状态存储(etcd)交互,这种解耦设计保证了控制面的统一性与安全性。
咱们可以把它理解成 Kubernetes 集群的 “遥控器”。不管你是要查看集群里的服务状态,还是部署新的应用,都得靠它来发号施令。举个实际的例子,要是你想看看当前集群里运行着哪些 Pod,直接在终端输入kubectl get pods,它就会把所有 Pod 的名称、状态、运行时间这些信息列得明明白白。而且它的功能特别灵活,比如你发现某个 Pod 出问题了,想查看详细日志,用kubectl logs Pod名称就能快速定位问题;要是想进入 Pod 内部排查,kubectl exec -it Pod名称 – /bin/bash这条命令就能帮你直接“钻进” 容器里。不过刚接触的朋友可能会觉得命令太多记不住,其实不用慌,记不住的时候输入kubectl –help,它就会把所有可用的命令和参数都列出来,像个随身的“说明书”,用得多了自然就熟练了。
再聊聊kubelet,它相当于 Kubernetes 集群里的 “服务员”,而且是每个节点上都必须有的 “专属服务员”。咱们部署的应用最终要跑在各个节点上,而 kubelet 的主要工作就是确保这些应用能按照要求正常运行。比如说,你通过 kubectl 下发了 “在节点 A 上启动两个 nginx 容器” 的指令,这个指令会先传到集群的控制平面,然后控制平面再把任务派给节点 A 上的 kubelet。接下来 kubelet 就会一直盯着这两个容器,要是其中一个意外挂掉了,它会立刻重新启动一个新的,保证始终有两个 nginx 容器在运行。另外,它还会定期向控制平面汇报节点的资源使用情况,比如 CPU 用了多少、内存还剩多少,这样控制平面就能随时掌握每个节点的状态,合理分配任务。可以说,要是没有 kubelet,咱们部署的应用就像没人管的 “散兵”,很容易出问题。
最后讲讲kubeadm,它就像是 Kubernetes 集群的 “搭建工具包”,专门帮咱们快速搭建起一个可用的集群。以前没 kubeadm 的时候,搭建 K8s 集群特别麻烦,得手动配置证书、部署控制平面组件,还得处理各种组件之间的依赖关系,没个半天一天根本搞不定,而且很容易出错。有了 kubeadm 之后,情况就不一样了。想搭建一个主节点,只需要在服务器上输入kubeadm init命令,它就会自动下载所需的组件镜像、生成证书、部署控制平面的核心组件,最后还会给出详细的后续操作步骤,告诉你怎么把工作节点加入集群。要是想把工作节点加入集群,也只需要在工作节点上执行kubeadm join命令,再加上主节点生成的令牌和证书哈希值就行,整个过程也就几分钟。不过要注意,kubeadm 主要是帮咱们完成集群的初始化搭建,后续的集群维护和管理,还得靠 kubectl 这些工具。
4.1配置k8s源
目前阿里云镜像中还没有Kylin-Server-V10-SP3-2403的kubernetes安装包,但是可以使用CentOS-7的安装包。
# 配置yum源
vim /etc/yum.repos.d/k8s.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

4.2安装kubectl、kubelet、kubeadm
yum install -y kubectl-1.23.17-0.x86_64 kubelet-1.23.17-0.x86_64 kubeadm-1.23.17-0.x86_64
# 设置kubelet开机自启(注意:现在先不要启动,需要等kubeadm init之后)
systemctl enable kubelet
# systemctl start kubelet (现在启动会失败,是正常的)
五、使用kubeadm初始化Master节点
现在,我们将在kylin-k8s-master上执行集群的初始化。
5.1初始化master
# 查看k8s需要的镜像列表和版本
[root@kylin-k8s-master ~]# kubeadm config images list
I0825 17:55:19.479962 336705 version.go:256] remote version is much newer: v1.33.4; falling back to: stable-1.23
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
# 拉取镜像
[root@kylin-k8s-master ~]# docker pull registry.k8s.io/kube-apiserver:v1.23.17
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.17
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.23.17
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.17
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.17
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/etcd:3.5.6-0
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/pause:3.6
[root@kylin-k8s-master ~]# docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.6

# 在kylin-k8s-master上进行初始化
kubeadm init \\
–apiserver-advertise-address=0.0.0.0 \\
–control-plane-endpoint=192.168.17.246:6443 \\
–pod-network-cidr=172.20.0.0/16 \\
–service-cidr=10.96.0.0/16 \\
–kubernetes-version=v1.23.17 \\
–image-repository=registry.aliyuncs.com/google_containers
参数说明:
①–apiserver-advertise-address:这个参数指定 API Server 绑定的 IP 地址。设为0.0.0.0表示允许所有网络接口访问,适合需要从集群外部管理的场景,比如你的控制节点有多个网卡时,这样设置能避免只能从特定网卡访问的限制。
②–control-plane-endpoint:这是集群的稳定访问端点。这里填了具体的 IP 和端口(6443 是 K8s 默认的 API 端口),主要作用是让后续加入的节点知道该连接哪个地址来接入集群。如果以后想做高可用,这个端点可以换成负载均衡器的地址,现在先用单节点的 IP 顶着。
③–pod-network-cidr:这个是给 Pod 分配的网络地址段。K8s 里的 Pod 需要相互通信,这个参数定义了整个集群里 Pod 可用的 IP 范围。注意这个网段要和你后面打算部署的网络插件(比如 Calico、Flannel)配置一致,不然 Pod 之间可能不通。
④–service-cidr:这是为集群内部 Service 分配的地址段。Service 是 Pod 的访问入口,这个参数规定了 Service 虚拟 IP 的取值范围,默认就是 10.96.0.0/16,这里保持默认没问题。
⑤–kubernetes-version:很直观,就是指定要安装的 K8s 版本。写清楚版本号能避免 kubeadm 自动拉取最新版带来的兼容性问题,适合需要稳定版本的生产环境。
⑥–image-repository:默认情况下 kubeadm 会从谷歌官方仓库拉取镜像,国内网络可能访问不畅。这里换成阿里云的镜像仓库,能大大加快镜像下载速度,避免初始化时卡在拉镜像这一步。
成功界面:

5.2配置k8s访问权限
[root@kylin-k8s-master ~]# mkdir -p $HOME/.kube
[root@kylin-k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kylin-k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@kylin-k8s-master ~]# systemctl restart kubelet.service

这时查看节点状态为NotReady、coredns状态为Pending,是因为没有安装网络组件,我们还需要安装好网络组件才能显示为Ready和Running。

六、安装网络组件
k8s的网络组件可以选择flannel或者calico,由于calico性能比flannel高,所以我们一般使用calicocalico的版本要和k8s的版本匹配才可以,calico-v3.25.0可以适配kubernetes-v1.23.17。以下是适配表:
| 1.18、1.19、1.20 | 3.18 |
| 1.19、1.20、1.21 | 3.19 |
| 1.19、1.20、1.21 | 3.20 |
| 1.20、1.21、1.22 | 3.21 |
| 1.21、1.22、1.23 | 3.22 |
| 1.22、1.23、1.24、1.25 | 3.24 |
| 1.27、1.28、1.29、1.30 | 3.28 |
6.1手动拉取calico-v3.25.0镜像
calico-v3.25.0需要的cni、kube-controllers、node镜像版本(三台主机都需要执行,需要科学上网),如果无法拉取可以先拉镜像然后修改标签,如下:
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 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-control
lers: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
删除旧标签镜像:
[root@kylin-k8s-master ~]# docker rmi -f swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/kube-controllers:v3.25.0 swr.cn-north-4.myhuaweiclo
ud.com/ddn-k8s/docker.io/calico/cni:v3.25.0 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0



6.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
# 不方便的可以去我主页下载
6.3配置calico

注意格式,保证"-name"和前后项对齐,IP地址段和–pod-network-cidr=172.20.0.0/16必须一致,如果服务器有多个网卡需要指定正确的网卡,我这里是ens18(ifconfig命令确认网卡名称),否则会自动使用第一个网卡,这样可能会导致网络冲突部署失败。安装calico网络组件只需要在k8s主节点(kylin-k8s-master)上执行该命令,calico会自动在集群中的其他节点上进行配置和分发,所有节点必须能够拉取cni、kube-controllers、node镜像或者提前手动导入镜像,之后有任何新的节点加入集群,这些新的节点也必须有这些镜像才可以部署成功。
6.4安装部署网络组件calico(只在主节点kylin-k8s-master上安装)

6.5查看节点以及pod资源是否显示正常

七、添加节点到k8s集群
7.1在kylin-k8s-master上执行,查看token和sha256的值

7.2节点加入集群(在两个节点kylin-k8s-node01和kylin-k8s-node02上分别执行)


7.3重启所有集群节点(三台主机都要执行)


八、安装k8s-Dashboard
Kubernetes Dashboard 是官方推出的 Web 可视化管理工具,相当于 K8s 集群的 “可视化操作台”,能帮用户摆脱纯命令行操作,更直观地管理集群资源。它的核心功能覆盖集群日常管理的主要场景:比如能清晰展示所有节点的运行状态,包括 CPU、内存使用率等关键指标,点击节点还能查看其上运行的 Pod、容器详情;对于 Pod、Deployment、Service 等核心资源,支持在页面上直接创建、编辑和删除,创建时可通过表单填写参数,也能上传 YAML 文件,操作比命令行更易上手;还能实时查看 Pod 的日志输出,无需执行 kubectl logs 命令,排查问题更高效,同时支持对 Deployment 进行扩缩容,只需拖动滑块或输入数值就能快速调整副本数。此外,Dashboard 还提供权限控制功能,可基于 K8s 的 RBAC 机制为不同用户分配不同操作权限,比如给开发人员仅开放 Pod 查看和日志查看权限,保障集群安全。不过要注意,Dashboard 默认未启用外部访问,部署后需通过 kubectl proxy 或配置 Ingress 等方式暴露访问入口,且为避免安全风险,建议不要在生产环境开放公网访问,同时启用 HTTPS 加密和强身份认证。以下是k8s和dashboard的版本支持对应表:
| 1.17 | 2.0.0-rc7 |
| 1.18 | 2.0.0 |
| 1.19 | 2.0.4 |
| 1.20 | 2.4.0 |
| 1.21 | 2.4.0 |
| 1.23 | 2.5.0、2.5.1 |
| 1.24 | 2.6.0、2.6.1 |
| 1.25 | 2.7.0 |
| 1.27 | 3.0.0-alpha0 |
| 1.29 | 7.5.0 |
8.1下载dashboard v2.5.1版本部署(需要科学上网)
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
8.2修改recommended.yaml文件
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部,如下:

8.3设置拉取镜像的优先级为本地优先


imagePullPolicy参数说明:
①Always:每次启动pod时都会尝试从镜像仓库拉取指定的镜像,这说明无论本地是否存在该镜像,k8s都会检查远程仓库并拉取最新的镜像
②IfNotPresent:只有本地不存在该镜像时,才从远程拉取;如果本地已有相同标签的镜像,就使用本地的镜像
③Never:完全不从远程拉群镜像,只使用本地镜像
8.4手动拉取镜像(三台主机都需要执行)
国外的镜像我们无法直接下载,我们使用阿里云的镜像,提前在所有节点下载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 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
8.5删除原标签镜像
docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.5.1
docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7



8.6运行yaml文件(只在kylin-k8s-master上安装)
[root@kylin-k8s-master ~]# kubectl apply -f recommended.yaml

查看dashboard容器运行状态:
[root@kylin-k8s-master ~]# kubectl get pod -n kubernetes-dashboard

8.7Kubernetes创建Dashboard超级管理员账户(只在kylin-k8s-master上安装)
创建service account并绑定默认cluster-admin管理员集群角色
[root@kylin-k8s-master ~]# kubectl create serviceaccount admin -n kube-system
[root@kylin-k8s-master ~]# kubectl create clusterrolebinding admin –clusterrole=cluster-admin –serviceaccount=kube-system:admin
[root@kylin-k8s-master ~]# kubectl get secret -n kube-system | grep admin
[root@kylin-k8s-master ~]# kubectl describe secret -n kube-system admin-token-kmkz7

8.8登录Dashboard
正常安装部署完Dashboard之后,通过大多数浏览器是不能正常访问的,这是因为部署Dashboard时默认生成的证书问题导致的。打开浏览器输入访问地址(https://192.168.17.246:30001),鼠标点击页面任意地方,键盘输入"thisisunsafe"回车就能正常访问,输入过程不显示输入的内容。
粘贴输入Token登录:


九、测试k8s集群
9.1创建一个nginx服务(只在kylin-k8s-master上执行)
[root@kylin-k8s-master ~]# docker pull nginx:latest # 拉取nginx镜像
# 创建nginx服务
[root@kylin-k8s-master ~]# kubectl create deployment nginx-server –image=nginx:latest –replicas=2
# 暴露外部访问端口
[root@kylin-k8s-master ~]# kubectl expose deployment nginx-server –type=NodePort –name=nginx-service –port=80 –target-port=80
[root@kylin-k8s-master ~]# kubectl get services # 查看暴露的外部端口

在Dashboard也能看到创建的nginx服务:

9.2访问nginx服务

9.3说明提示
①在NodePort类型的服务中,外部访问通常时通过某个特定的NodePort端口,不能直接通过80端口。
②kubernetes会为服务分配一个30000到32767范围内的随机端口
③外部用户需要通过Node的IP地址和这个NodePort端口进行访问
④直接访问80端口访问nginx服务是不行的
⑤如果希望通过80端口访问,建议使用LoadBalancer或者Ingress
结语
朋友们,走完这一趟完整的部署流程,你会发现,在银河麒麟上部署k8s,技术本身并不是最难的。真正的挑战在于对Linux底层原理的理解、对k8s各个组件协作关系的清晰认知,以及面对千奇百怪的环境问题时,那份沉下心來排查和解决的耐心。
这个过程,就像是在给一艘巨大的国产航母(银河麒麟)安装上最先进的自动化指挥系统(k8s)。一开始可能会磕磕绊绊,但一旦调试成功,它爆发出的战斗力将是惊人的。这不仅是技术的胜利,更是每一位中国工程师在信创浪潮中,用一行行代码和一条条命令构建起的底气。
希望这篇超详细的指南能成为你手中的一张“航海图”,助你在国产化与云原生的海洋中,顺利启航!好了,今天的分享就到这里,如果觉得有用,别忘了点赞关注哦!我们下期再见!




