#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org
k3s是经CNCF一致性认证的Kubernetes发行版,专为物联网及边缘计算设计。架构包含server节点,agent节点。在生产环境中部署,需要部署多server节点保证高可用。这里只是为了快速体验 k3s, 采用单节点 server 和多agent节点的方式。架构如下:
部署前工作
- 系统更新
- 网络配置:包括主机名配置,时区配置,软件源等
- 关闭防火墙,selinux
- 关闭交换分区
部署server节点
# 1. 先安装配置docker
[root@k3s1 ~]# yum install -y docker-ce
[root@k3s1 ~]# systemctl enable --now docker
# 2. 下载安装 k3s
[root@k3s1 ~]# wget https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
# 2.1 默认 k3s 不适用docker,采用 containerd,这里特别指明采用 docker
# 2.2 使用 INSTALL_K3S_MIRROR=cn 环境变量制定使用国内源加速下载
# 2.3 k3s 自带 lb 插件,这里我们禁用这个插件,后面采用 metallb 的方案
[root@k3s1 ~]# INSTALL_K3S_MIRROR=cn bash k3s-install.sh --docker --disable=traefik
# 3. 查看 k3s 的 token, 后面部署 agent 用到
[root@k3s1 ~]# cat /var/lib/rancher/k3s/server/node-token
K1013f26620ae0297e33b4369b3e634d41a93994787d3f9ca6f3c24dbad8d898ba3::server:eb416ac93cf97f38599d9207ac3d74d6
部署 agent 节点
# 1. 安装配置 docker
[root@k3s2 ~]# yum install -y docker-ce
[root@k3s2 ~]# systemctl enable --now docker
# 2. 下载安装 k3s
[root@k3s2 ~]# wget https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
# 2.1 默认 k3s 不适用docker,采用 containerd,这里特别指明采用 docker
# 2.2 使用 INSTALL_K3S_MIRROR=cn 环境变量制定使用国内源加速下载, SERVER_IP 是server服务器的IP地址,token通过上一步获取
[root@k3s2 ~]# INSTALL_K3S_MIRROR=cn K3S_URL=https://[SERVER_IP]:6443 K3S_TOKEN=[TOKEN] bash k3s-install.sh --docker
测试
部署完成后,在server节点验证集群情况
[root@k3s1 work]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s1 Ready control-plane,master 3m50s v1.23.6+k3s1
k3s2 NotReady <none> 9s v1.23.6+k3s1
[root@k3s1 work]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
helm-install-traefik-zd94v 0/1 ContainerCreating 0 3m50s
helm-install-traefik-crd-9qvk7 0/1 ContainerCreating 0 3m50s
coredns-d76bd69b-kmnwq 1/1 Running 0 3m50s
local-path-provisioner-6c79684f77-wckqm 1/1 Running 0 3m50s
metrics-server-7cd5fcb6b7-m8ltf 1/1 Running 0 3m50s
部署一个nginx服务验证
[root@k3s1 work]# cat nginx.yaml && echo "==============================" && cat srv.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
==============================
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
[root@k3s1 work]# kubectl apply -f nginx.yaml
[root@k3s1 work]# kubectl apply -f svc.yaml
[root@k3s1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 16h
nginx-service NodePort 10.43.50.167 <none> 80:31574/TCP 3m18s
[root@k3s1 ~]# curl localhost:31574
<!DOCTYPE html>
......
</html>
部署负载均衡
k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer,metallb提供了在私有云或者裸机环境下的负载均衡方案。这里我们也采用 metallb 的方案。
安装 metallb
[root@k3s1 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
[root@k3s1 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
[root@k3s1 metallb]# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-f54fbc6f9-ppm96 1/1 Running 0 47s
speaker-g7g8l 1/1 Running 0 48s
speaker-h57p6 1/1 Running 0 48s
配置 metallb
[root@k3s1 metallb]# cat metallb-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
# 可配置为下列形式或者192.168.1.0/24形式,根据预留的网段具体决定
# 可配置多个,根据实际情况配置
- 192.168.137.111-192.168.137.121
[root@k3s1 metallb]# kubectl apply -f metallb-configmap.yaml
configmap/config created
测试
部署一个 lb 的service
[root@k3s1 metallb]# cat lb.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
[root@k3s1 metallb]# kubectl apply -f metallb-configmap.yaml
configmap/config created
# 这里我手动修改了 pod 里面nginx的内容为他的内网ip地址以便测试
[root@k3s1 metallb]# curl http://192.168.137.111
10.42.1.3
[root@k3s1 metallb]# curl http://192.168.137.111
10.42.0.22
其他
k3s 不支持 docker 的 systemd 的 cgroupdriver, 如果有自定义docker配置,务必不要配置此项