网站一起做网店,wordpress 引用,淘宝客采集网站建设,中心建设投官方网站 软件下载▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第171篇原创文章目录Replication Controller和ReplicaSet无状态服务Deployment概念Deployment的创建Deployment的更新Deployment的回滚Deployment扩容和缩容… ▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第171篇原创文章目录Replication Controller和ReplicaSet无状态服务Deployment概念Deployment的创建Deployment的更新Deployment的回滚Deployment扩容和缩容Deployment更新暂停和恢复Deployment更新注意事项有状态应用管理StatefulSet概念创建一个StatefulSet应用Replication Controller和ReplicaSetReplication Controller复制控制器RC和ReplicaSet复制集RS是两种简单部署Pod的方式。在生产环境中主要使用更高级的Deployment等方式进行Pod的管理和部署。Replication ControllerReplicaSetReplication ControllerReplication Controller简称RC可确保Pod副本数达到期望值也就是RC定义的数量。换句话说Replication Controller可确保一个Pod或一组同类Pod总是可用。如果存在的Pod大于设定的值则Replication Controller将终止额外的Pod。如果太小Replication Controller将启动更多的Pod用于保证达到期望值。与手动创建Pod不同的是用Replication Controller维护的Pod在失败、删除或终止时会自动替换。因此即使应用程序只需要一个Pod也应该使用Replication Controller或其他方式管理。Replication Controller类似于进程管理程序但是Replication Controller不是监视单个节点上的各个进程而是监视多个节点上的多个Pod。定义一个Replication Controller的示例如下。apiVersion: v1
kind: ReplicationController
metadata:name: nginx
spec:replicas: 3selector:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80
ReplicaSetReplicaSet是支持基于集合的标签选择器的下一代Replication Controller它主要用作Deployment协调创建、删除和更新Pod和Replication Controller唯一的区别是ReplicaSet支持标签选择器。在实际应用中虽然ReplicaSet可以单独使用但是一般建议使用Deployment来自动管理ReplicaSet除非自定义的Pod不需要更新或有其他编排等。定义一个ReplicaSet的示例如下apiVersion: apps/v1
kind: ReplicaSet
metadata:name: frontendlabels:app: guestbooktier: frontend
spec:# modify replicas according to your casereplicas: 3selector:matchLabels:tier: frontendmatchExpressions:- {key: tier, operator: In, values: [frontend]}template:metadata:labels:app: guestbooktier: frontendspec:containers:- name: php-redisimage: gcr.io/google_samples/gb-frontend:v3resources:requests:cpu: 100mmemory: 100Mienv:- name: GET_HOSTS_FROMvalue: dns# If your cluster config does not include a dns service, then to# instead access environment variables to find service host# info, comment out the value: dns line above, and uncomment the# line below.# value: envports:- containerPort: 80
查看一下使用Deployment来自动管理ReplicaSet[rootk8s-master01 ~]# kubectl get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 2d
[rootk8s-master01 ~]# kubectl get deploy -n kube-system metrics-server -oyaml
message: ReplicaSet metrics-server-64c6c494dc has successfully progressed.
查看ReplicaSet[rootk8s-master01 ~]# kubectl get rs -n kube-system
NAME DESIRED CURRENT READY AGE
metrics-server-64c6c494dc 1 1 1 2d
如果我们改动了一个参数做了滚动升级它就会重新生成一个rs这个rs可以被回滚而rc是不支持回滚的我们一般使用高级的功能比如Deployment和DaemonSet去管理我们的rc或rs再通过rs管理我们的podReplication Controller和ReplicaSet的创建删除和Pod并无太大区别Replication Controller目前几乎已经不在生产环境中使用ReplicaSet也很少单独被使用都是使用更高级的资源Deployment、DaemonSet、StatefulSet进行管理Pod。无状态服务Deployment概念用于部署无状态的服务这个最常用的控制器。一般用于管理维护企业内部无状态的微服务比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。Deployment的创建手动创建[rootk8s-master01 ~]# kubectl create deployment nginx --imagenginx:1.15.2
deployment.apps/nginx created
导出到nginx-deploy.yaml[rootk8s-master01 ~]# kubectl get deployment nginx -o yaml nginx-deploy.yaml
查看nginx-deploy.yaml[rootk8s-master01 ~]# vim nginx-deploy.yaml
删除status以下的内容修改副本数replicas: 2 #副本数
更新配置[rootk8s-master01 ~]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx replaced
查看副本数[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-66bbc9fdc5-vtk4n 1/1 Running 0 16m
nginx-66bbc9fdc5-x87z5 1/1 Running 0 34s
以上是使用文件的方式管理也可以使用edit[rootk8s-master01 ~]# kubectl edit deploy nginx
# 把副本数改回1
replicas: 1
查看副本数[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-66bbc9fdc5-vtk4n 1/1 Running 0 19m
查看文件[rootk8s-master01 ~]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: 1creationTimestamp: 2021-07-22T08:50:24Zgeneration: 1labels: # Deployment本身的labelsapp: nginxname: nginxnamespace: defaultresourceVersion: 1439468uid: f6659adb-7b49-48a5-8db6-fbafa6baa1d7
spec:progressDeadlineSeconds: 600replicas: 2 # 副本数revisionHistoryLimit: 10 # 历史记录保留的个数selector:matchLabels:app: nginx # 与下面pod的labels必须保持一致不然管理不了pod匹配rs新版本创建之后不允许修改修改之后产生新的rs无法对应旧的labelstrategy:rollingUpdate:# 滚动升级的策略maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate: # pod的参数metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.15.2imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
查看deploy的labels[rootk8s-master01 ~]# kubectl get deploy --show-labels
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
nginx 1/1 1 1 22m appnginx
状态解析[rootk8s-master01 ~]# kubectl get deploy -owide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 40m nginx nginx:1.15.2 appnginx
NAMEDeployment名称READYPod的状态已经Ready的个数UP-TO-DATE已经达到期望状态的被更新的副本数AVAILABLE已经可以用的副本数AGE显示应用程序运行的时间CONTAINERS容器名称IMAGES容器的镜像SELECTOR管理的Pod的标签Deployment的更新修改spec里面的template才会触发更新查看镜像版本[rootk8s-master01 ~]# kubectl get deploy -oyaml | grep image- image: nginx:1.15.2imagePullPolicy: IfNotPresent
更改deployment的镜像并记录[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:1.15.3 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx image updated
查看滚动更新过程[rootk8s-master01 ~]# kubectl rollout status deploy nginx
deployment nginx successfully rolled out
或者使用describe查看[rootk8s-master01 ~]# kubectl describe deploy nginx
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 8m37s (x2 over 21h) deployment-controller Scaled up replica set nginx-66bbc9fdc5 to 1Normal ScalingReplicaSet 8m35s deployment-controller Scaled down replica set nginx-5dfc8689c6 to 0Normal ScalingReplicaSet 7m41s (x2 over 165m) deployment-controller Scaled up replica set nginx-5dfc8689c6 to 1Normal ScalingReplicaSet 7m39s (x2 over 165m) deployment-controller Scaled down replica set nginx-66bbc9fdc5 to 0
查看rs[rootk8s-master01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-5dfc8689c6 1 1 1 165m
nginx-66bbc9fdc5 0 0 0 21h
滚动更新的策略是先启动一个新的rs将副本数设置为1再把旧的删掉一个然后再启动一个新的查看滚动更新策略配置[rootk8s-master01 ~]# vim nginx-deploy.yaml strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdat
Deployment的回滚更新deploy镜像[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:787977da --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx image updated[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-ww9v4 1/1 Running 0 17m
nginx-7d79b96f68-m94sh 0/1 ErrImagePull 0 12s
查看历史版本[rootk8s-master01 ~]# kubectl rollout history deploy nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
3 kubectl set image deploy nginx nginxnginx:1.15.3 --recordtrue
4 kubectl set image deploy nginx nginxnginx:1.15.3 --recordtrue
5 kubectl set image deploy nginx nginxnginx:787977da --recordtrue
回滚到上一个版本[rootk8s-master01 ~]# kubectl rollout undo deploy nginx
deployment.apps/nginx rolled back
查看pod可以看到只剩一个[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-ww9v4 1/1 Running 0 20m
进行多次更新[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:787977da --record
deployment.apps/nginx image updated
[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:787977dadaa --record
deployment.apps/nginx image updated
[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:787977xxxxxdadaa --record
deployment.apps/nginx image updated
查看历史记录[rootk8s-master01 ~]# kubectl rollout history deploy nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
3 kubectl set image deploy nginx nginxnginx:1.15.3 --recordtrue
6 kubectl set image deploy nginx nginxnginx:1.15.3 --recordtrue
7 kubectl set image deploy nginx nginxnginx:787977da --recordtrue
8 kubectl set image deploy nginx nginxnginx:787977dadaa --recordtrue
9 kubectl set image deploy nginx nginxnginx:787977xxxxxdadaa --recordtrue
查看指定版本的详细信息[rootk8s-master01 ~]# kubectl rollout history deploy nginx --revision6
deployment.apps/nginx with revision #6
Pod Template:Labels: appnginxpod-template-hash5dfc8689c6Annotations: kubernetes.io/change-cause: kubectl set image deploy nginx nginxnginx:1.15.3 --recordtrueContainers:nginx:Image: nginx:1.15.3Port: noneHost Port: noneEnvironment: noneMounts: noneVolumes: none
回滚到执行的版本[rootk8s-master01 ~]# kubectl rollout undo deploy nginx --to-revision6
deployment.apps/nginx rolled back
查看deploy状态[rootk8s-master01 ~]# kubectl get deploy -oyaml
Deployment扩容和缩容扩容[rootk8s-master01 ~]# kubectl scale --replicas3 deploy nginx
deployment.apps/nginx scaled[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-nhplc 1/1 Running 0 41s
nginx-5dfc8689c6-ww9v4 1/1 Running 0 72m
nginx-5dfc8689c6-xh9l6 1/1 Running 0 41s
缩容[rootk8s-master01 ~]# kubectl scale --replicas2 deploy nginx
deployment.apps/nginx scaled[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-nhplc 1/1 Running 0 2m1s
nginx-5dfc8689c6-ww9v4 1/1 Running 0 73m
nginx-5dfc8689c6-xh9l6 0/1 Terminating 0 2m1sNAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-nhplc 1/1 Running 0 2m17s
nginx-5dfc8689c6-ww9v4 1/1 Running 0 73m
Deployment更新暂停和恢复使用edit命令可以修改多个配置再一次性更新但是通过set命令每次都会触发更新那么该如何做呢可以使用Deployment更新暂停功能[rootk8s-master01 ~]# kubectl rollout pause deployment nginx
deployment.apps/nginx paused
使用set命令修改配置[rootk8s-master01 ~]# kubectl set image deploy nginx nginxnginx:1.15.3 --record
Flag --record has been deprecated, --record will be removed in the future# 进行第二次配置变更添加内存CPU配置
[rootk8s-master01 ~]# kubectl set resources deploy nginx -c nginx --limitscpu200m,memory128Mi --requestscpu10m,memory16Mi
deployment.apps/nginx resource requirements updated
查看deploy[rootk8s-master01 ~]# kubectl get deploy nginx -oyamlresources:limits:# 容器最大的CPU和内容容量cpu: 200mmemory: 128Mirequests: # 容器启动最小的CPU和内容容量cpu: 10mmemory: 16Mi
查看pod是否被更新[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-5dfc8689c6-nhplc 1/1 Running 0 22m
nginx-5dfc8689c6-ww9v4 1/1 Running 0 93m
可以看到pod没有更新更新恢复[rootk8s-master01 ~]# kubectl rollout resume deploy nginx
deployment.apps/nginx resumed
查看rs[rootk8s-master01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-5475c49ffb 0 0 0 71m
nginx-5dfc8689c6 0 0 0 4h12m
nginx-66bbc9fdc5 0 0 0 23h
nginx-68db656dd8 2 2 2 32s
nginx-799b8478d4 0 0 0 71m
nginx-7d79b96f68 0 0 0 77m
可以看到32s前新增了nginx的rs更新被恢复就可以创建新的容器了Deployment更新注意事项查看deploy[rootk8s-master01 ~]# kubectl get deploy nginx -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: 11kubernetes.io/change-cause: kubectl set image deploy nginx nginxnginx:1.15.3--recordtruecreationTimestamp: 2021-07-22T08:50:24Zgeneration: 20labels:app: nginxname: nginxnamespace: defaultresourceVersion: 1588198uid: f6659adb-7b49-48a5-8db6-fbafa6baa1d7
spec:progressDeadlineSeconds: 600replicas: 2revisionHistoryLimit: 10 # 设置保留RS旧的revision的个数设置为0的话不保留历史数据selector:matchLabels:app: nginxstrategy: # 滚动更新的策略rollingUpdate:maxSurge: 25% # 可以超过期望值的最大Pod数可选字段默认为25%可以设置成数字或百分比如果该值为0那么maxUnavailable不能为0maxUnavailable: 25% # 指定在回滚或更新时最大不可用的Pod的数量可选字段默认25%可以设置成数字或百分比如果该值为0那么maxSurge就不能0type: RollingUpdate # 更新deployment的方式默认是RollingUpdate滚动更新可以指定maxSurge和maxUnavailabletemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.15.3imagePullPolicy: IfNotPresentname: nginxresources:limits:cpu: 200mmemory: 128Mirequests:cpu: 10mmemory: 16MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
status:availableReplicas: 2conditions:- lastTransitionTime: 2021-07-23T07:48:01ZlastUpdateTime: 2021-07-23T07:48:01Zmessage: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: Truetype: Available- lastTransitionTime: 2021-07-23T08:10:50ZlastUpdateTime: 2021-07-23T08:10:53Zmessage: ReplicaSet nginx-68db656dd8 has successfully progressed.reason: NewReplicaSetAvailablestatus: Truetype: ProgressingobservedGeneration: 20readyReplicas: 2replicas: 2updatedReplicas: 2
.spec.minReadySeconds可选参数指定新创建的Pod在没有任何容器崩溃的情况下视为Ready最小的秒数默认为0即一旦被创建就视为可用。.spec.strategy.type Recreate重建先删除旧的Pod在创建新的Pod有状态应用管理StatefulSet概念StatefulSet的基本概念StatefulSet注意事项StatefulSet有状态集缩写为sts常用于部署有状态的且需要有序启动的应用程序比如在进行SpringCloud项目容器化时Eureka的部署是比较适合用StatefulSet部署方式的可以给每个Eureka实例创建一个唯一且固定的标识符并且每个Eureka实例无需配置多余的Service其余Spring Boot应用可以直接通过Eureka的Headless Service即可进行注册。Eureka的statefulset的资源名称是eurekaeureka-0 eureka-1 eureka-2Serviceheadless service没有ClusterIP eureka-svcEureka-0.eureka-svc.NAMESPACE_NAME eureka-1.eureka-svc …StatefulSet的基本概念StatefulSet主要用于管理有状态应用程序的工作负载API对象。比如在生产环境中可以部署ElasticSearch集群、MongoDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。和Deployment类似一个StatefulSet也同样管理着基于相同容器规范的Pod。不同的是StatefulSet为每个Pod维护了一个粘性标识。这些Pod是根据相同的规范创建的但是不可互换每个Pod都有一个持久的标识符在重新调度时也会保留一般格式为StatefulSetName-Number。比如定义一个名字是Redis-Sentinel的StatefulSet指定创建三个Pod那么创建出来的Pod名字就为Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。而StatefulSet创建的Pod一般使用Headless Service无头服务进行通信和普通的Service的区别在于Headless Service没有ClusterIP它使用的是Endpoint进行互相通信Headless一般的格式为statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
serviceName为Headless Service的名字创建StatefulSet时必须指定Headless Service名称0..N-1为Pod所在的序号从0开始到N-1statefulSetName为StatefulSet的名字namespace为服务所在的命名空间.cluster.local为Cluster Domain集群域。假如公司某个项目需要在Kubernetes中部署一个主从模式的Redis此时使用StatefulSet部署就极为合适因为StatefulSet启动时只有当前一个容器完全启动时后一个容器才会被调度并且每个容器的标识符是固定的那么就可以通过标识符来断定当前Pod的角色。比如用一个名为redis-ms的StatefulSet部署主从架构的Redis第一个容器启动时它的标识符为redis-ms-0并且Pod内主机名也为redis-ms-0此时就可以根据主机名来判断当主机名为redis-ms-0的容器作为Redis的主节点其余从节点那么Slave连接Master主机配置就可以使用不会更改的Master的Headless Service此时Redis从节点Slave配置文件如下port 6379
slaveof redis-ms-0.redis-ms.public-service.svc.cluster.local 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
……
其中redis-ms-0.redis-ms.public-service.svc.cluster.local是Redis Master的Headless Service在同一命名空间下只需要写redis-ms-0.redis-ms即可后面的public-service.svc.cluster.local可以省略。StatefulSet注意事项一般StatefulSet用于有以下一个或者多个需求的应用程序需要稳定的独一无二的网络标识符。需要持久化数据。需要有序的、优雅的部署和扩展。需要有序的自动滚动更新。如果应用程序不需要任何稳定的标识符或者有序的部署、删除或者扩展应该使用无状态的控制器部署应用程序比如Deployment或者ReplicaSet。StatefulSet是Kubernetes 1.9版本之前的beta资源在1.5版本之前的任何Kubernetes版本都没有。Pod所用的存储必须由PersistentVolume Provisioner持久化卷配置器根据请求配置StorageClass或者由管理员预先配置当然也可以不配置存储。为了确保数据安全删除和缩放StatefulSet不会删除与StatefulSet关联的卷可以手动选择性地删除PVC和PVStatefulSet目前使用Headless Service无头服务负责Pod的网络身份和通信需要提前创建此服务。删除一个StatefulSet时不保证对Pod的终止要在StatefulSet中实现Pod的有序和正常终止可以在删除之前将StatefulSet的副本缩减为0。创建一个StatefulSet应用定义一个StatefulSet资源文件创建一个StatefulSet定义一个StatefulSet资源文件[rootk8s-master01 ~]# vim nginx-sts.yaml
# 添加以下内容
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: nginx # StatefulSet必须配置一个serviceName它指向已经存在的service上面定义replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.15.2ports:- containerPort: 80name: web
kind: Service定义了一个名字为Nginx的Headless Service创建的Service格式为nginx-0.nginx.default.svc.cluster.local其他的类似因为没有指定Namespace命名空间所以默认部署在default。kind: StatefulSet定义了一个名字为web的StatefulSetreplicas表示部署Pod的副本数本实例为2。在StatefulSet中必须设置Pod选择器.spec.selector用来匹配其标签.spec.template.metadata.labels。在1.8版本之前如果未配置该字段.spec.selector将被设置为默认值在1.8版本之后如果未指定匹配Pod Selector则会导致StatefulSet创建错误。当StatefulSet控制器创建Pod时它会添加一个标签statefulset.kubernetes.io/pod-name该标签的值为Pod的名称用于匹配Service。创建一个StatefulSet[rootk8s-master01 ~]# kubectl create -f nginx-sts.yaml
service/nginx created
statefulset.apps/web created
查看pod[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 5s
web-1 1/1 Running 0 3s
查看service[rootk8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 none 443/TCP 14d
nginx ClusterIP None none 80/TCP 52s
扩容sts[rootk8s-master01 ~]# kubectl scale --replicas3 sts web
statefulset.apps/web scaled
查看pod[rootk8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 2m21s
web-1 1/1 Running 0 2m19s
web-2 1/1 Running 0 14s
新增busybox解析无头servicecatEOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: busyboxnamespace: default
spec:containers:- name: busyboximage: busybox:1.28command:- sleep- 3600imagePullPolicy: IfNotPresentrestartPolicy: Always
EOF
验证StatefulSet[rootk8s-master01 ~]# kubectl exec -ti busybox -- sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # nslookup web-0.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: web-0.nginx
Address 1: 172.25.244.242 web-0.nginx.default.svc.cluster.local
/ # exit
获取pod的IP[rootk8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 3m34s 172.25.244.245 k8s-master01 none none
nginx-68db656dd8-2dv8l 1/1 Running 0 106m 172.25.244.241 k8s-master01 none none
nginx-68db656dd8-8lcrk 1/1 Running 0 106m 172.25.244.240 k8s-master01 none none
web-0 1/1 Running 0 9m3s 172.25.244.242 k8s-master01 none none
web-1 1/1 Running 0 9m1s 172.25.244.243 k8s-master01 none none
web-2 1/1 Running 0 6m56s 172.25.244.244 k8s-master01 none none
可以看到它直接把service地址解析成pod的IP不通过service访问直接通过IP访问减少了一层代理性能更高所以不需要配置clusterIP clusterIP: None
课程链接http://www.kubeasy.com/推荐阅读《Kubernetes全栈架构师Kubeadm高可用安装k8s集群--学习笔记》《.NET 云原生架构师训练营模块一 架构师与云原生--学习笔记》《.NET Core开发实战第1课课程介绍--学习笔记》点击下方卡片关注DotNet NB一起交流学习▲ 点击上方卡片关注DotNet NB一起交流学习请在公众号后台回复 【路线图】获取.NET 2021开发者路线图回复 【原创内容】获取公众号原创内容回复 【峰会视频】获取.NET Conf开发者大会视频回复 【个人简介】获取作者个人简介回复 【年终总结】获取作者年终总结回复 【加群】加入DotNet NB 交流学习群长按识别下方二维码或点击阅读原文。和我一起交流学习分享心得。