root@k3s-agent-1:~# curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
例如:
1
root@k3s-agent-1:~# curl -sfL https://get.k3s.io | K3S_URL=https://10.0.0.39:6443 K3S_TOKEN=K101e23ad4c6b37c9fdf****::server:****f7538ded6 sh -
执行完成后,到 Server 节点查看所有节点状态:
1 2 3 4
root@k3s-server:~# kubectl get node NAME STATUS ROLES AGE VERSION k3s-server Ready control-plane,master 25m v1.24.4+k3s1 k3s-agent-1 Ready <none> 18s v1.24.4+k3s1
同样,对于 k3s-agent-2 也做同样的部署,完成后节点状态如下:
1 2 3 4 5
root@k3s-server:~# kubectl get node NAME STATUS ROLES AGE VERSION k3s-server Ready control-plane,master 31m v1.24.4+k3s1 k3s-agent-2 Ready <none> 3m36s v1.24.4+k3s1 k3s-agent-1 Ready <none> 6m19s v1.24.4+k3s1
root@k3s-server:~/k3s# kubectl exec -it nginx -- /bin/bash root@nginx:/# curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p> </body> </html>
root@k3s-server:~/k3s# kubectl apply -f nginx-deployment.yaml deployment.apps/nginx created
查看运行状态:
1 2 3
root@k3s-server:~/k3s# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 2/2 2 2 29s
此时再查看 Pod,如下:
1 2 3 4
root@k3s-server:~/k3s# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-544dc8b7c4-lzvz9 1/1 Running 0 3m4s nginx-544dc8b7c4-5nbcw 1/1 Running 0 3m4s
可以看到,由 Deployment 产生的 Pod 命名规则如下:
1
${DeploymentName}-${DeploymentUid}-${Hash}
在查看 Pod 的时候,如果加上 -o wide 参数,就可以查看更多信息:
1 2 3 4
root@k3s-server:~/k3s# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-544dc8b7c4-lzvz9 1/1 Running 0 9m30s 10.42.1.4 k3s-agent-1 <none> <none> nginx-544dc8b7c4-5nbcw 1/1 Running 0 9m30s 10.42.3.3 k3s-agent-2 <none> <none>
可以看到,该 nginx 被创建了两个 Pod 副本,分别部署在了 k3s-agent-1 和 k3s-agent-2 上面。
创建 Service
Service,将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
举个例子,考虑一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。
Service 定义的抽象能够解耦这种关联。
Service 有两种类型,一种是 NodePort,选择该种类型的可直接通过 ${serverIP}:${nodePort} 访问内部的服务;另一种是 ClusterIP 类型,它只会在集群内部可以访问到该 Pod,不会把 Pod 的内容映射在某一个外网可以访问的端口上,但这并不意味着不能对外提供服务,而是需要 Ingress 的帮助,来将外网的流量转发到 Service 上来。
root@k3s-server:~/k3s# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 12h nginx-service NodePort 10.43.74.219 <none> 80:30080/TCP 7m21s
root@k3s-server:~/k3s# kubectl apply -f nginx-ingress.yaml ingress.networking.k8s.io/nginx-ingress created
现在访问 http://nginx.k3s.jiji.pro 即可访问到部署的服务:
尝试关掉 k3s-agent-1:
1
root@k3s-agent-1:/home/jiji# shutdown -h now
证实 k3s-agent-1 确实下线了:
1 2 3 4 5
root@k3s-server:~# kubectl get node NAME STATUS ROLES AGE VERSION k3s-server Ready control-plane,master 13h v1.24.4+k3s1 k3s-agent-2 Ready <none> 12h v1.24.4+k3s1 k3s-agent-1 NotReady <none> 12h v1.24.4+k3s1
再访问 http://nginx.k3s.jiji.pro,服务出现不可用,但刷新后也可访问正常。经过两次连续的 ping,我们发现 DNS 解析由原本失效的 10.0.0.31,变为了 10.0.0.39。这也就保证了在 Agent 宕机的情况下服务高可用。