本教程主要用于CentOS7操作系统如何搭建K3s环境。
前言
k3s 是一个轻量级 Kubernetes,它易于安装,二进制文件包小,占用内存小。
k3s 旨在成为完全兼容的 Kubernetes 发行版,相比 k8s 主要更改如下:
- 旧的、Alpha 版本的、非默认功能都已经删除。
- 删除了大多数内部云提供商和存储插件,可以用插件替换。
- 新增 SQLite3 作为默认存储机制,etcd3 仍然有效,但是不再是默认项。
- 封装在简单的启动器中,可以处理大量 LTS 复杂性和选项。
- 最小化到没有操作系统依赖,只需要一个内核和 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. 快速清理实验环境
|
|
7. 卸载 K3s
|
|
下一个教程安装面板,来部署一个nginx实例。
本文没有授权给任何组织、企业和个人转载,未经作者允许禁止转载!
欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。