本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。
服务器版本 | docker软件版本 | Kubernetes(k8s)集群版本 | CPU架构 |
---|---|---|---|
CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点。
(资料图片)
服务器 | 操作系统版本 | CPU架构 | 进程 | 功能描述 |
---|---|---|---|---|
k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master节点 |
k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker节点 |
Kubernetes 是一个强大的容器编排平台,它可以帮助开发者快速、可靠地部署和管理容器化应用程序。其中一个重要的概念就是 service(服务)。在 Kubernetes 中,service 是一组 Pod 的抽象,用于提供稳定的网络端点以便其他应用程序访问。本文将介绍 Kubernetes service 的相关知识,包括服务的发现和服务的发布。
使用service服务的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。
三.Kubernetes service简介Kubernetes 中的 service 是一种可以提供内部负载均衡的抽象,用于将应用程序暴露为一个稳定的网络端点。Kubernetes service 可以通过一个虚拟 IP 地址或者 DNS 来暴露一个应用程序。当需要访问这个应用程序时,只需要使用这个虚拟 IP 地址或者 DNS 就可以了,而不需要知道实际运行这个应用程序的节点的 IP 地址。这种方式可以帮助我们解耦应用程序和底层网络架构,从而使应用程序能够更加灵活地运行在不同的环境中。
Kubernetes 中的 service 还有一些重要的特性,包括:
内部负载均衡:Kubernetes service 提供了内部负载均衡的功能,可以将请求均匀地分配给后端 Pod,从而提高应用程序的可用性和响应速度。服务发现:Kubernetes service 允许我们使用标准的 DNS 解析或者环境变量来查找其他服务。这种方式可以使得不同的服务之间能够更加方便地进行通信。在线升级:Kubernetes service 支持在线升级,可以在不影响现有的服务的情况下进行版本升级。四.使用hostPort向外界暴露应用程序service简写为svc。创建svc存放yaml文件的目录。
[root@k8scloude1 ~]# mkdir svc[root@k8scloude1 ~]# cd svc/[root@k8scloude1 svc]# pwd/root/svc
创建svc的namespace
[root@k8scloude1 svc]# kubectl create ns svcnamespace/svc created
切换命名空间到svc
[root@k8scloude1 svc]# kubens svcContext "kubernetes-admin@kubernetes" modified.Active namespace is "svc".[root@k8scloude1 svc]# kubectl get podNo resources found in svc namespace.
4.1 创建deploydeploy控制器能更好的控制pod,我们先创建deploy。关于deploy控制器的详细内容请查看博客《Kubernetes(k8s)控制器(一):deployment》。
生成创建deploy的yaml文件。
[root@k8scloude1 svc]# kubectl create deploy nginx --image=nginx --dry-run=client -o yaml >nginxdeploy.yaml[root@k8scloude1 svc]# cat nginxdeploy.yaml apiVersion: apps/v1kind: Deploymentmetadata: creationTimestamp: null labels: app: nginx name: nginxspec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx name: nginx resources: {}status: {}
修改yaml文件,表示创建一个名为nginx的deploy,pod副本数为1。
[root@k8scloude1 svc]# vim nginxdeploy.yaml [root@k8scloude1 svc]# cat nginxdeploy.yaml apiVersion: apps/v1kind: Deploymentmetadata: creationTimestamp: null labels: app: nginx name: nginxspec: #replicas: 1表示pod副本数为1 replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: #terminationGracePeriodSeconds: 0 表示当Pod被终止时,不需要等待额外的时间。 terminationGracePeriodSeconds: 0 containers: - image: nginx imagePullPolicy: IfNotPresent name: nginx resources: {}status: {}
创建deploy,可以看到1个pod。
[root@k8scloude1 svc]# kubectl apply -f nginxdeploy.yaml deployment.apps/nginx created[root@k8scloude1 svc]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-6cf858f6cf-5wh5s 1/1 Running 0 7s 10.244.112.155 k8scloude2 [root@k8scloude1 svc]# kubectl get deploy -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx 1/1 1 1 23s nginx nginx app=nginx
pod的地址为10.244.112.155,对于pod的地址,在kubernetes集群的任何节点都可以访问,但是外界访问不了。
[root@k8scloude1 svc]# ping 10.244.112.155PING 10.244.112.155 (10.244.112.155) 56(84) bytes of data.64 bytes from 10.244.112.155: icmp_seq=1 ttl=63 time=0.430 ms64 bytes from 10.244.112.155: icmp_seq=2 ttl=63 time=0.516 ms64 bytes from 10.244.112.155: icmp_seq=3 ttl=63 time=0.595 ms^C--- 10.244.112.155 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2001msrtt min/avg/max/mdev = 0.430/0.513/0.595/0.072 ms
4.2 使用hostPort向外界暴露pod的端口为了让kubernetes集群以外的机器可以访问pod,可以使用hostPort
字段把容器的端口映射到物理机的端口,这样外界就可以访问pod了,类似于docker容器端口映射,关于docker容器端口映射可以查看博客《一文搞懂docker容器基础:docker镜像管理,docker容器管理》。
查看hostPort字段的解释
[root@k8scloude1 svc]# kubectl explain pod.spec.containers.ports.hostPortKIND: PodVERSION: v1FIELD: hostPort DESCRIPTION: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.
修改deploy的yaml文件,添加hostPort参数,把容器80端口映射到物理机的6554端口。
[root@k8scloude1 svc]# vim nginxdeploy.yaml [root@k8scloude1 svc]# cat nginxdeploy.yaml apiVersion: apps/v1kind: Deploymentmetadata: creationTimestamp: null labels: app: nginx name: nginxspec: replicas: 1 selector: matchLabels: app: nginx strategy: {} template: metadata: creationTimestamp: null labels: app: nginx spec: #terminationGracePeriodSeconds: 0 表示Pod终止时不需要等待额外时间。 terminationGracePeriodSeconds: 0 containers: - image: nginx imagePullPolicy: IfNotPresent #把容器80端口映射到物理机的6554端口 ports: - name: http containerPort: 80 hostPort: 6554 name: nginx resources: {}status: {}
删除旧的deploy并创建新的deploy
[root@k8scloude1 svc]# kubectl delete deploy nginx deployment.apps "nginx" deleted[root@k8scloude1 svc]# kubectl apply -f nginxdeploy.yaml deployment.apps/nginx created[root@k8scloude1 svc]# kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEnginx 1/1 1 1 8s
查看pod,发现pod运行在k8scloude2上,访问k8scloude2的6554端口即可访问pod。
[root@k8scloude1 svc]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-6f64cc5884-kkqmf 1/1 Running 0 15s 10.244.112.158 k8scloude2 [root@k8scloude1 svc]# kubectl get deploy -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx 1/1 1 1 25s nginx nginx app=nginx
nginx-6f64cc5884-kkqmf 这个pod运行在k8scloude2上,访问k8scloude2地址加端口,即可访问pod的nginx服务。
[root@k8scloude1 svc]# curl http://192.168.110.129:6554......Welcome to nginx!
If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.
......Thank you for using nginx.