K3s环境搭建

K3s环境搭建

本教程主要用于CentOS7操作系统如何搭建K3s环境。

前言

k3s 是一个轻量级 Kubernetes,它易于安装,二进制文件包小,占用内存小。

k3s 旨在成为完全兼容的 Kubernetes 发行版,相比 k8s 主要更改如下:

  1. 旧的、Alpha 版本的、非默认功能都已经删除。
  2. 删除了大多数内部云提供商和存储插件,可以用插件替换。
  3. 新增 SQLite3 作为默认存储机制,etcd3 仍然有效,但是不再是默认项。
  4. 封装在简单的启动器中,可以处理大量 LTS 复杂性和选项。
  5. 最小化到没有操作系统依赖,只需要一个内核和 cgroup 挂载。

K3s 默认将使用 containerd 作为容器环境,由于本身习惯Docker方式,这里只列举使用Docker环境安装

1.K3s使用Docker容器环境安装

本次使用的操作系统是:CentOS Linux release 7.6.1810,已经关闭了SELinux,而且关闭了自带的firewalld,使用了iptables去管理防火墙

# 关 firewalld 防火墙,一般我用的是iptables
# systemctl stop firewalld
# systemctl disable firewalld

1.1 配置docker环境

# yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# yum install -y yum-utils

# yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

# yum install -y docker-ce docker-ce-cli containerd.io


# 解决内核检查问题 重启生效
# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"


# systemctl enable docker
# systemctl start docker

# mkdir -p /etc/docker
# 修改 docker 源
cat << EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
   ]
}
EOF

# systemctl daemon-reload
# systemctl restart docker
# 安装 docker 结束

如果已有Docker环境,只需要

# 解决内核检查问题 机器重启生效
# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"

1.2 安装K3s

# curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.25.6+k3s1 sh -s - --docker

安装后会显示

Created symlink from /etc/systemd/system/multi-user.target.wants/k3s.service to /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s
  • 重启机器

2.检查安装是否成功

  • 运行配置检查
k3s check-config
  • 查看节点状态以及 k3s 版本
# kubectl get node
NAME        STATUS   ROLES                  AGE     VERSION
gzqltemp1   Ready    control-plane,master   5m46s   v1.25.6+k3s1
  • 查看所有pod信息
# kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS       AGE
kube-system   helm-install-traefik-crd-b7b2w            0/1     Completed   0              6m7s
kube-system   helm-install-traefik-f4wsb                0/1     Completed   2              6m7s
kube-system   svclb-traefik-730729fb-qw8z9              2/2     Running     2 (4m7s ago)   4m53s
kube-system   coredns-597584b69b-7k7zw                  1/1     Running     1 (4m7s ago)   6m7s
kube-system   traefik-66c46d954f-7k8df                  1/1     Running     1 (4m7s ago)   4m53s
kube-system   metrics-server-5f9f776df5-gxqh4           1/1     Running     1 (4m7s ago)   6m7s
kube-system   local-path-provisioner-79f67d76f8-blnhj   1/1     Running     0              6m7s
  • 顺便看看它自动下载的docker镜像
# docker images
REPOSITORY                         TAG                    IMAGE ID       CREATED         SIZE
rancher/mirrored-metrics-server    v0.6.2                 25561daa6660   2 months ago    68.9MB
rancher/klipper-lb                 v0.4.0                 3449ea2a2bfa   2 months ago    8.76MB
rancher/klipper-helm               v0.7.4-build20221121   6f2af12f2834   2 months ago    251MB
rancher/mirrored-library-traefik   2.9.4                  288889429bec   3 months ago    135MB
rancher/local-path-provisioner     v0.0.23                9621e18c3388   3 months ago    37.4MB
rancher/mirrored-coredns-coredns   1.9.4                  a81c2ec4e946   4 months ago    49.8MB
rancher/mirrored-pause             3.6                    6270bb605e12   17 months ago   683kB
  • 再看看docker容器
# docker ps -a|grep -v Exit
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS                      PORTS     NAMES
3dab56bc02d2   rancher/local-path-provisioner     "local-path-provisio   10 minutes ago   Up 10 minutes                         k8s_local-path-provisioner_local-path-provisioner-79f67d76f8-blnhj_kube-system_452b8728-bad8-4f7e-9f06-3229b3ccdb75_0
3074aafba02d   a81c2ec4e946                       "/coredns -conf /etc   11 minutes ago   Up 11 minutes                         k8s_coredns_coredns-597584b69b-7k7zw_kube-system_484ecab1-96a8-467f-afd0-cee828c00075_1
6e64eb6e5952   3449ea2a2bfa                       "entry"                  11 minutes ago   Up 11 minutes                         k8s_lb-tcp-443_svclb-traefik-730729fb-qw8z9_kube-system_0cb91004-a195-4878-ae11-086e14300ac9_1
886d013affa7   rancher/mirrored-pause:3.6         "/pause"                 11 minutes ago   Up 11 minutes                         k8s_POD_coredns-597584b69b-7k7zw_kube-system_484ecab1-96a8-467f-afd0-cee828c00075_1
037380ca1dc1   25561daa6660                       "/metrics-server --c   11 minutes ago   Up 11 minutes                         k8s_metrics-server_metrics-server-5f9f776df5-gxqh4_kube-system_89091f30-6b29-412d-99e4-ab47c2ecf3aa_1
bc39edf73142   3449ea2a2bfa                       "entry"                  11 minutes ago   Up 11 minutes                         k8s_lb-tcp-80_svclb-traefik-730729fb-qw8z9_kube-system_0cb91004-a195-4878-ae11-086e14300ac9_1
b20034e39854   288889429bec                       "/entrypoint.sh --gl   11 minutes ago   Up 11 minutes                         k8s_traefik_traefik-66c46d954f-7k8df_kube-system_2ce1fd6d-38c3-49eb-9b4e-6bf97c74ef6d_1
db9d2a18b738   rancher/mirrored-pause:3.6         "/pause"                 11 minutes ago   Up 11 minutes                         k8s_POD_metrics-server-5f9f776df5-gxqh4_kube-system_89091f30-6b29-412d-99e4-ab47c2ecf3aa_1
ab7c0df95680   rancher/mirrored-pause:3.6         "/pause"                 11 minutes ago   Up 11 minutes                         k8s_POD_svclb-traefik-730729fb-qw8z9_kube-system_0cb91004-a195-4878-ae11-086e14300ac9_1
f99c606c02d2   rancher/mirrored-pause:3.6         "/pause"                 11 minutes ago   Up 11 minutes                         k8s_POD_traefik-66c46d954f-7k8df_kube-system_2ce1fd6d-38c3-49eb-9b4e-6bf97c74ef6d_1
1c7672ea8cdd   rancher/mirrored-pause:3.6         "/pause"                 11 minutes ago   Up 11 minutes                         k8s_POD_local-path-provisioner-79f67d76f8-blnhj_kube-system_452b8728-bad8-4f7e-9f06-3229b3ccdb75_1

这里只是安装完了master节点,那我们来测试下吧。

3.demo验证

3.1 创建一个whoami服务

 # kubectl create deploy whoami --image=traefik/whoami --replicas=2
 # kubectl describe deploy whoami
 
 
 # 监控 pod 状态,通过扩缩容可直观看到 pod 的调度情况
 # kubectl get pods --watch
 # 尝试下对 whoami 应用进行扩缩容
 # kubectl scale deploy whoami --replicas=5

3.2 通过 Service 暴露给集群内部访问

默认为 NodePort 模式,会在每个节点监听

# kubectl expose deploy whoami --port=80

# kubectl get svc -owide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP   20m   <none>
whoami       ClusterIP   10.43.241.180   <none>        80/TCP    29s   app=whoami

# kubectl describe svc whoami
Name:              whoami
Namespace:         default
Labels:            app=whoami
Annotations:       <none>
Selector:          app=whoami
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.43.241.180
IPs:               10.43.241.180
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.42.0.14:80,10.42.0.15:80,10.42.0.16:80 + 2 more...
Session Affinity:  None
Events:            <none>

  • 多次测试是否有轮询
# curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-5485697bcc-5pzx4
IP: 127.0.0.1
IP: 10.42.0.14
RemoteAddr: 10.42.0.1:55974
GET / HTTP/1.1
Host: 10.43.241.180
User-Agent: curl/7.29.0
Accept: */*

# curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-5485697bcc-h47b8
IP: 127.0.0.1
IP: 10.42.0.17
RemoteAddr: 10.42.0.1:55984
GET / HTTP/1.1
Host: 10.43.241.180
User-Agent: curl/7.29.0
Accept: */*

# curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
Hostname: whoami-5485697bcc-cqffc
IP: 127.0.0.1
IP: 10.42.0.18
RemoteAddr: 10.42.0.1:56004
GET / HTTP/1.1
Host: 10.43.241.180
User-Agent: curl/7.29.0
Accept: */*

3.3 通过 Service 暴露给集群外网访问

  • 指定 LoadBalancer 模式并指定公网 IP,自行替换 <PUBLIC_IP> 为当前节点的公网 IP
# kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>
  • 查看暴露的端口
# kubectl get svc whoami -owide
NAME     TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE   SELECTOR
whoami   LoadBalancer   10.43.241.180   公网IP   80:32101/TCP   16s   app=whoami

这里因为端口没指定,随机端口是32101。

  • 机器上进行测试
# 集群内部仍可正常访问
# curl 10.43.241.180
# curl `kubectl get -o template service/whoami --template='{{.spec.clusterIP}}'`
  • 通过外网浏览器访问,如果是云服务器,需要开启云服务商Web页面的防火墙配置
http://公网IP:32101

由于前面端口未指定是随机的,所以如果是别的端口,请根据实际修改。

4.节点网络

如果我们要多部署一个agent,机器列表假设如下规划:

机器节点 机器IP
master 10.0.12.6
agent 10.0.12.13

那么需要注意开放什么网络权限呢?先来了解几个端口的描述。

协议 端口 来源 描述
TCP 80 Load balancer/proxy,做外部 SSL 终端 使用外部 SSL 终止时的 Rancher UI/API
TCP 443 server 节点agent 节点托管/注册的 Kubernetes任何需要能够使用 Rancher UI 或 API 的源 Rancher agent, Rancher UI/API, kubectl
TCP 6443 K3s server 节点 Kubernetes API
UDP 8472 K3s server 和 agent 节点 Flannel VXLAN 需要
TCP 10250 K3s server 和 agent 节点 kubelet

为了部署简单,这里我们禁用了系统的防火墙,如果开启防火墙,需要设置防火墙规则

4.1 master节点网络开放

  • 6443/TCP - Kubernetes API 服务
  • 8472/UDP - Flannel VXLAN 模式需要
  • 10250/TCP - Kubelet metrics 需要

下面是/etc/sysconfig/iptables里对应的端口

-A INPUT -p tcp -m state --state NEW -m tcp -s 10.0.12.13 --dport 6443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -s 10.0.12.13 --dport 10250 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp -s 10.0.12.13 --dport 8472 -j ACCEPT

4.2 agent节点网络开放

假设master节点是10.0.12.6,那么agent节点放行以下两个端口即可,当然也可以放行该IP所有端口。

-A INPUT -p tcp -m state --state NEW -m tcp --dport 10250 -s 10.0.12.6 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 8472 -s 10.0.12.6 -j ACCEPT

5. 部署agent节点

  • 去master机器节点查看token
# cat /var/lib/rancher/k3s/server/node-token
K10bdb596fd375a4b5a68f303c876c1ecbf592b43f2407854abed0877ee58953d2f::server:2be0a7fb6f62be5d53eaf41103f77dc6
  • 在agent机器节点上执行以下命令
# export K3S_TOKEN="K10bdb596fd375a4b5a68f303c876c1ecbf592b43f2407854abed0877ee58953d2f::server:2be0a7fb6f62be5d53eaf41103f77dc6"

# export K3S_URL=https://10.0.12.6:6443

# 由于都是同一个局域网,不存在跨云,所以agent后面没加" --node-external-ip "当前节点的公网ip
# curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.25.6+k3s1 sh -s - agent --docker

启动服务后,等一会,然后可以通过这个命令进行检查

# systemctl status k3s-agent.service

如果启动异常,想重启

systemctl restart k3s-agent
  • master服务器查看节点
# kubectl get node
NAME        STATUS   ROLES                  AGE   VERSION
temp2   Ready    <none>                 74m   v1.25.6+k3s1
temp1   Ready    control-plane,master   19h   v1.25.6+k3s1
  • master机器节点上将whoami服务扩容,可以看到agent节点多了whoami服务
 # 尝试下对 whoami 应用进行扩缩容
 # kubectl scale deploy whoami --replicas=10

6. 快速清理实验环境

1
kubectl delete all --all

7. 卸载 K3s

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 一键卸载 server
/usr/local/bin/k3s-uninstall.sh

# 如果有安装agent 一键卸载 agent
/usr/local/bin/k3s-agent-uninstall.sh


# 重启后清理
rm -rf ~/.kube
rm -rf /etc/rancher
rm -rf /var/lib/cni
rm -rf /var/lib/rancher
rm -rf /var/lib/kubelet
rm -rf /var/log/containers
rm -rf /var/log/k3s*
rm -rf /var/log/pods

下一个教程安装面板,来部署一个nginx实例。


本文没有授权给任何组织、企业和个人转载,未经作者允许禁止转载!

欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。

公众号二维码

updatedupdated2023-02-022023-02-02