网络受限环境k3s安装记录
背景
在 我需要什么样的集群搭建工具 中解释过,我有时候需要在 网络受限 的环境搭建 k8s 环境。由于 k3s 官方对 air gap 环境的支持比较好,因此记录一下如何做的安装。
过程记录
下载资源
资源地址: https://github.com/k3s-io/k3s/releases
建立资源文件夹
1
mkdir k3s && cd k3s
下载 k3s 二进制文件
1
wget https://github.com/k3s-io/k3s/releases/download/v1.21.12-rc3%2Bk3s1/k3s
下载依赖镜像
1
wget https://github.com/k3s-io/k3s/releases/download/v1.21.12-rc3%2Bk3s1/k3s-airgap-images-amd64.tar.gz
下载部署脚本
1
wget -O install.sh https://get.k3s.io/
设置执行权限
1
chmod +x k3s install.sh
将整个文件夹打包
1
2cd ..
tar -czf k3s.tar.gz k3s
集群节点操作
将资源上传到机器上
1
scp k3s.tar.gz xxxx:~/
登录机器
1
ssh xxxx
解压资源
1
tar -zxf k3s.tar.gz
进入资源文件夹
1
cd k3s
创建 k3s 默认镜像目录
1
mkdir -p /var/lib/rancher/k3s/agent/images/
将 k3s 放入 bin 目录
1
cp k3s /usr/local/bin/
解压默认镜像包
1
tar -zmxf k3s-airgap-images-amd64.tar.gz -C /var/lib/rancher/k3s/agent/images/
安装 master 节点
1
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC="server --disable traefik --token testdemo" ./install.sh
安装常用工具
安装 helm
下载 helm
1
wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
解压
1
tar -xzvf helm-v3.7.1-linux-amd64.tar.gz
移动到 bin 下
1
mv linux-amd64/helm /usr/local/bin/helm
清理残余
1
rm -rf helm-v3.7.1-linux-amd64.tar.gz linux-amd64
合一块儿操作
1
2
3
4
5
6wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz && \
tar -xzvf helm-v3.7.1-linux-amd64.tar.gz && \
mv linux-amd64/helm /usr/local/bin/helm && \
rm -rf helm-v3.7.1-linux-amd64.tar.gz linux-amd64 && \
echo '<<<< 🎉🎉🎉 FINISH INSTALL HELM 🎉🎉🎉 >>>>' && \
helm version
安装 dashboard
获取基础 dashboard 清单
1
wget -O dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml
修改镜像拉取策略
1
imagePullPolicy: IfNotPresent
修改 token 过期时间 (option)
1
2# 在 deploy 启动参数中加入
--token-ttl=86400手动获取镜像
1
2
3
4
5
6
7docker pull kubernetesui/dashboard:v2.6.0
docker save -o dashboard.tar kubernetesui/dashboard:v2.6.0
docker pull kubernetesui/metrics-scraper:v1.0.8
docker save -o metrics-scraper.tar kubernetesui/metrics-scraper:v1.0.8压缩镜像
1
2tar -zcf dashboard.tar.gz dashboard.tar
tar -zcf metrics-scraper.tar.gz metrics-scraper.tar传递到服务器
1
2scp dashboard.tar.gz xxxx:~/k3s
scp metrics-scraper.tar.gz xxxx:~/k3s将镜像放入 k3s 默认路径中
1
2tar -zxf dashboard.tar.gz -C /var/lib/rancher/k3s/agent/images/
tar -zxf metrics-scraper.tar.gz -C /var/lib/rancher/k3s/agent/images/手动导入到 ctr 中 ( 不想重启 k3s )
1
2ctr i import /var/lib/rancher/k3s/agent/images/dashboard.tar
ctr i import /var/lib/rancher/k3s/agent/images/metrics-scraper.tar设置访问账户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22cat <<eof > dashboard.role.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
eof部署 dashboard
1
kubectl apply -f dashboard.yaml -f dashboard.role.yaml
设置 dashboard 端口访问
1
2
3
4kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 将 port 改为 8082 (或自定义)
# 将 type 改为 LoadBalancer访问地址
1
https://xxxx:8082/
跳过证书验证
1
2# 在浏览器页面按下
thisisunsafe获取 token
1
kubectl -n kubernetes-dashboard describe secret admin-user-token | grep '^token'
修改 metrics scriber 的保存时长
1
2
3
4
5
6kubectl edit deploy -n kubernetes-dashboard dashboard-metrics-scraper
# 添加 args
args:
- --metric-duration
- 360h持久化 metrics, 创建 pvc
1
2
3
4
5
6
7
8
9
10
11
12
13
14cat <<eof > metrics.pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: metrics-pvc
namespace: kubernetes-dashboard
spec:
accessModes:
- ReadWriteOnce
# storageClassName: local-path
resources:
requests:
storage: 2Gi
eof创建 pvc
1
kubectl apply -f metrics.pvc.yaml
修改 metrics deploy
1
kubectl edit deploy -n kubernetes-dashboard dashboard-metrics-scraper
1 |
|
安装 nginx-ingress
ingress 作为集群的统一入口,几乎是必不可少的。nginx 是最被大家熟悉的了,因此平常就使用 nginx 作为 ingress。
获取 nginx-ingress-controller 清单
1
wget -O ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/release-v1.3/deploy/static/provider/kind/1.22/deploy.yaml
获取 镜像
1
2
3
4
5
6
7
8
9docker pull registry.k8s.io/ingress-nginx/controller:v1.3.0
docker pull docker.io/jettech/kube-webhook-certgen:v1.2.1
docker save -o kube-webhook-certgen.tar docker.io/jettech/kube-webhook-certgen:v1.2.1
docker save -o ingress-nginx.tar registry.k8s.io/ingress-nginx/controller:v1.3.0
tar -zcf ingress-nginx.tar.gz ingress-nginx.tar
tar -zcf kube-webhook-certgen.tar.gz kube-webhook-certgen.tar上传镜像
1
2scp ingress-nginx.tar.gz xxxx:~/k3s
scp kube-webhook-certgen.tar.gz xxxx:~/k3s导入镜像
1
2
3
4
5tar -zxf ingress-nginx.tar.gz -C /var/lib/rancher/k3s/agent/images/
tar -zxf kube-webhook-certgen.tar.gz -C /var/lib/rancher/k3s/agent/images/
ctr i import /var/lib/rancher/k3s/agent/images/ingress-nginx.tar
ctr i import /var/lib/rancher/k3s/agent/images/kube-webhook-certgen.tar修改yaml镜像
1
2
3
4
5# nginx deployment
image: registry.k8s.io/ingress-nginx/controller:v1.3.0
# job
image: docker.io/jettech/kube-webhook-certgen:v1.2.1去掉 node-selector
1
2#删除 ingress-ready: "true"
kubectl edit deploy ingress-nginx-controller -n ingress-nginx部署
1
kubectl apply -f ingress-nginx.yaml
修改 svc 类型为 LoadBalancer (似乎不用)
1
kubectl edit svc ingress-nginx-controller -n ingress-nginx
测试一下
1
curl xxxx
对 dashboard 增加 ingress
证书的来源,可以是自签,也可以是申请真正的证书,具体可以参考 如何解决证书问题
- 创建 secret
1
k create secret tls mg-tls --key _wildcard.mg.com-key.pem --cert _wildcard.mg.com.pem
修改 dashboard 为 http 访问
仅需要把--auto-generate-certificates
给注释掉,然后开放9090
端口即可,另外,把 readness 探活端口也改成 90901
kubectl edit deploy kubernetes-dashboard -n kubernetes-dashboard
把 service 指向 9090
1
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
创建 ingress yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25cat <<eof > dashboard.ing.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.mg.com
http:
paths:
- backend:
service:
name: kubernetes-dashboard
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- dashboard.mg.com
secretName: mg-tls
eof创建 ingress
1
kubectl apply -f dashboard.ing.yaml
- (可选) 实际也可以用 nginx 直接代理 https
1
2
3# 直接在注解中添加
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
安装 bash-completion
安装
1
yum install -y bash-completion
配置 helm 到 bash-completion 配置文件中
1
helm completion bash > /etc/bash_completion.d/helm
生效
1
source /usr/share/bash-completion/bash_completion
踩了一个大坑
- 阿里云会墙掉未备案的域名,如果想走公网ip,就不能随便自签一个证书
对通信过程的抓包
对 tls 握手的抓包
- 查看 tls 握手过程 #network #ssl
1
openssl s_client -connect baidu.com:443 -msg
国内非 air gap 也可以使用如下加速安装:
1 |
|
后续要继续做的
- 调研存储的实现方案 (nfs、longhorn)
- 调研 cert manager 的作用
- 完成对基础环境的封包
- 解决调试的问题( init container )
- 考虑是否解决证书轮转问题
- 考虑解决 registry 问题
- 解决日志采集问题 (采或不采是个问题,方案就用 fluentd) 简单的集群日志采集方案 ✅ 2023-02-16
- 解决集群监控问题 及 告警问题 简单的集群监控方案 ✅ 2023-02-16
- 解决非常基础的一些组件问题 (redis、mysql、kafka)
- 解决多集群管理问题 (rancher)
- 解决多集群发布问题
As you walk in God’s divine wisdom, you will surely begin to see a greater measure of victory and good success in your life.
— Joseph Prince
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!