# 我的解题之路：安装K8s

我一直觉得，在安装K8s这个事情上，K3s将易用性做到了极致(仅限于我所知道的方法)，当然，这里面还有我对于轻量性解决方法的偏爱，或者严谨一点，在PoC/测试场景中，没有特殊要求的话，快速部署指定的K8s版本，K3s或许是一个值得考虑的选择。

应国产化信创的需求，公司的平台需要跟华为鲲鹏服务器做适配，需要在服务上安装K8s，

```dockerfile
# uname -r 
4.19.90-52.15.v2207.ky10.aarch64
# uname -m
aarch64
```

虽然官方有提供安装K8s的文档及部署工具，但是支持的K8s版本太老了，有同事部署在华为云鲲鹏服务器上部署过K8s 1.18的版本，但是不太巧，最近团队在使用K8s高版本的适配，最高支持到K8s 1.26，这时再使用1.18的版本怎么也说不过去。最重要，我问部署过K8s的同事，对方直接甩给我华为官方文档链接，看着那离线安装脚本就头大，也没有想改的欲望了，可复用性也高，于是决定想其它办法，另辟蹊径。

鉴于又前用使用K3s的经历，而且K3s还是K8s的认证发行版，又非常轻量，于是我决定用K3s的自动化部署工具来安装。

安装过程也非常简洁：

```dockerfile
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_VERSION=v1.22.10+k3s1 INSTALL_K3S_MIRROR=cn sh -
```

初步验证后发现部署过程会中断，在K3s的issue中找到了对于这个问题的描述

> Installation scripts can't handle `VERSION_ID` on Kylin V10 OS #8206

原来K3s官方也没有做过kylin v10的适配，可能脚本需要做一些改动。顺着这条issue我以找到了对应的PR: [Make the install script support kylin v10](https://github.com/k3s-io/k3s/pull/8207), 然后又遇到selinux的问题，

> \[ERROR\] Failed to find the k3s-selinux policy, please install

幸好有人也遇到过这个问题，通过排查发现k3s有一个叫做[k3s-selinux](https://github.com/k3s-io/k3s-selinux/releases/tag/v1.3.stable.1)的项目，但我并不知道在kylin v10上应该使用哪个版本，只能用最笨的办法，只能一个个试，

1. [k3s-selinux-1.3-1.el9.noarch.rpm](https://github.com/k3s-io/k3s-selinux/releases/download/v1.3.stable.1/k3s-selinux-1.3-1.el9.noarch.rpm) 失败
    
2. [k3s-selinux-1.3-1.el8.noarch.rpm](https://github.com/k3s-io/k3s-selinux/releases/download/v1.3.stable.1/k3s-selinux-1.3-1.el8.noarch.rpm) 失败
    
3. [k3s-selinux-1.3-1.el7.noarch.rpm](https://github.com/k3s-io/k3s-selinux/releases/download/v1.3.stable.1/k3s-selinux-1.3-1.el7.noarch.rpm) 成功
    

多一点耐心，其实也就需要三次而已。虽然整个过程还是会遇到有一些琐碎的小问题，但好在总算整理出来一个可复用的版本，基本步骤如下：

1. systemctl stop firewalld
    
2. rpm -i k3s-selinux-1.3-1.el7.noarch.rpm
    
3. INSTALL\_K3S\_SKIP\_DOWNLOAD=true ./[install.sh](http://install.sh) # 离线安装可以加快部署速度，这里容器运行时是containerd
    

获取token

```dockerfile
cat /var/lib/rancher/k3s/server/token 
```

添加agent

```dockerfile
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://k3s-server-ip:6443 K3S_TOKEN=K3S-SEVER-TOKEN install.sh 
```

配置私有镜像中心:`/etc/rancher/k3s/registries.yaml`

```dockerfile
# cat /etc/rancher/k3s/registries.yaml
mirrors:
  # 内网harbor
  172.3.4.5:
    endpoint:
      - "http://172.3.4.5"
configs:
  "172.3.4.5":
    auth:
      username: XXX # 这是私有镜像仓库的用户名
      password: XXX # 这是私有镜像仓库的密码
```

k3s server:

```dockerfile
systemctl restart k3s
```

k3s agent

```dockerfile
systemctl restart k3s-agent
```

## **总结**

这个解题过程其实相当枯燥，因为实质上并没有太多难度，部署的个中细节我也没法在短时间内完全弄明白，只是秉承着一个原则：我应该不是第一个遇到这个问题人吧(如果我是第一个吃螃蟹的，那可太棒了，工作需要，一定会进行到底的)，所以只是运用了一些搜索手段罢了。但是这个事情的意义在于，它的可复用性一定会在后续的工作中给我以及同事带来例利。

ps: 对于轻量级的解决方法，俺真的是喜欢的不得了

参考：

* [https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengk8s\_04\_0007.html](https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengk8s_04_0007.html)
    
* [https://github.com/k3s-io/k3s/issues/8206](https://github.com/k3s-io/k3s/issues/8206)
    
* [https://slack-archive.rancher.com/t/12312628/hello-i-have-problem-doing-air-gapped-install-of-k3s-v1-26-3](https://slack-archive.rancher.com/t/12312628/hello-i-have-problem-doing-air-gapped-install-of-k3s-v1-26-3)
    
* [https://docs.rancher.cn/docs/k3s/installation/airgap/\_index/](https://docs.rancher.cn/docs/k3s/installation/airgap/_index/)
    
* [https://docs.rancher.cn/docs/k3s/installation/private-registry/\_index](https://docs.rancher.cn/docs/k3s/installation/private-registry/_index)
