- 一.系统环境
- 二.前言
- 三.Kubernetes service简介
-
四.使用hostPort向外界暴露应用程序
- 4.1 创建deploy
- 4.2 使用hostPort向外界暴露pod的端口
-
五.使用service服务向外界暴露应用程序
-
5.1 使用service服务向外界暴露pod
- 5.1.1 创建service服务
- 5.1.2 测试svc的负载均衡
-
5.1 使用service服务向外界暴露pod
-
六.service服务的发现
- 6.1 使用clusterIP的方式进行服务发现
- 6.2 使用环境变量的方式进行服务发现
- 6.3 使用DNS的方式进行服务发现(推荐)
-
七.service服务的发布
-
7.1 使用nodeport进行服务的发布
- 7.1.1 使用kubectl edit修改服务类型为NodePort
- 7.1.2 使用type指定服务类型为NodePort
-
7.2 使用LoadBalancer的方式进行服务的发布
- 7.2.1 安装METALLB
- 7.2.2 配置地址池
- 7.2.3 使用LoadBalancer的方式进行服务发布
-
7.1 使用nodeport进行服务的发布
一.系统环境
本文主要基于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 svc
namespace/svc created
切换命名空间到svc
[root@k8scloude1 svc]# kubens svc
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "svc".
[root@k8scloude1 svc]# kubectl get pod
No resources found in svc namespace.
4.1 创建deploy
deploy控制器能更好的控制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/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
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/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
#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 wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6cf858f6cf-5wh5s 1/1 Running 0 7s 10.244.112.155 k8scloude2
[root@k8scloude1 svc]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 23s nginx nginx app=nginx
pod的地址为10.244.112.155,对于pod的地址,在kubernetes集群的任何节点都可以访问,但是外界访问不了。
[root@k8scloude1 svc]# ping 10.244.112.155
PING 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 ms
64 bytes from 10.244.112.155: icmp_seq=2 ttl=63 time=0.516 ms
64 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 2001ms
rtt 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.hostPort
KIND: Pod
VERSION: v1
FIELD: hostPort
DESCRIPTION:
Number of port to expose on the host. If specified, this must be a valid
port number, 0
修改deploy的yaml文件,添加hostPort参数,把容器80端口映射到物理机的6554端口。
[root@k8scloude1 svc]# vim nginxdeploy.yaml
[root@k8scloude1 svc]# cat nginxdeploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
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 deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 8s
查看pod,发现pod运行在k8scloude2上,访问k8scloude2的6554端口即可访问pod。
[root@k8scloude1 svc]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6f64cc5884-kkqmf 1/1 Running 0 15s 10.244.112.158 k8scloude2
[root@k8scloude1 svc]# kubectl get deploy -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 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 and
working. Further configuration is required.
......
Thank you for using nginx.
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 7DGroup性能&测试开发文章持续更新(2019/12/13)
7DGroup 简介: 7DGroup 简介 性能闲谈系列: 浅谈window桌面GUI技术及图像渲染性能测试实践 杂谈:性能测试的范围到底有多大? 戏说CPU使用率-驳《CPU使用率度量指标是扯淡!》译文标题 对性能测试评估分析优化市场的反思 泛谈系统级跟踪…