Kubernetes全栈架构师(资源调度上)--学习笔记

 点击上方“DotNet NB”关注公众号

回复“1”获取开发者路线图

学习分享 丨作者 / 郑 子 铭    

这是DotNet NB 公众号的第171篇原创文章

目录

  • Replication Controller和ReplicaSet

  • 无状态服务Deployment概念

  • Deployment的创建

  • Deployment的更新

  • Deployment的回滚

  • Deployment扩容和缩容

  • Deployment更新暂停和恢复

  • Deployment更新注意事项

  • 有状态应用管理StatefulSet概念

  • 创建一个StatefulSet应用

Replication Controller和ReplicaSet

Replication Controller(复制控制器,RC)和ReplicaSet(复制集,RS)是两种简单部署Pod的方式。在生产环境中,主要使用更高级的Deployment等方式进行Pod的管理和部署。

  • Replication Controller

  • ReplicaSet

Replication Controller

Replication 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

ReplicaSet

ReplicaSet是支持基于集合的标签选择器的下一代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

[root@k8s-master01 ~]# kubectl get deploy -n kube-system
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server            1/1     1            1           2d
[root@k8s-master01 ~]# kubectl get deploy -n kube-system metrics-server -oyaml
message: ReplicaSet "metrics-server-64c6c494dc" has successfully progressed.

查看ReplicaSet

[root@k8s-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管理我们的pod

Replication Controller和ReplicaSet的创建删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet进行管理Pod。

无状态服务Deployment概念

用于部署无状态的服务,这个最常用的控制器。一般用于管理维护企业内部无状态的微服务,比如configserver、zuul、springboot。他可以管理多个副本的Pod实现无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

Deployment的创建

手动创建

[root@k8s-master01 ~]# kubectl create deployment nginx --image=nginx:1.15.2
deployment.apps/nginx created

导出到nginx-deploy.yaml

[root@k8s-master01 ~]# kubectl get deployment nginx -o yaml > nginx-deploy.yaml

查看nginx-deploy.yaml

[root@k8s-master01 ~]# vim nginx-deploy.yaml

删除status以下的内容,修改副本数

replicas: 2 #副本数

更新配置

[root@k8s-master01 ~]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx replaced

查看副本数

[root@k8s-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

[root@k8s-master01 ~]# kubectl edit deploy nginx
# 把副本数改回1
replicas: 1

查看副本数

[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-66bbc9fdc5-vtk4n   1/1     Running   0          19m

查看文件

[root@k8s-master01 ~]# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "1"creationTimestamp: "2021-07-22T08:50:24Z"generation: 1labels: # Deployment本身的labelsapp: nginxname: nginxnamespace: defaultresourceVersion: "1439468"uid: 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

[root@k8s-master01 ~]# kubectl get deploy --show-labels
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx   1/1     1            1           22m   app=nginx

状态解析

[root@k8s-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   app=nginx
  • NAME:Deployment名称

  • READY:Pod的状态,已经Ready的个数

  • UP-TO-DATE:已经达到期望状态的被更新的副本数

  • AVAILABLE:已经可以用的副本数

  • AGE:显示应用程序运行的时间

  • CONTAINERS:容器名称

  • IMAGES:容器的镜像

  • SELECTOR:管理的Pod的标签

Deployment的更新

修改spec里面的template才会触发更新

查看镜像版本

[root@k8s-master01 ~]# kubectl get deploy -oyaml | grep image- image: nginx:1.15.2imagePullPolicy: IfNotPresent

更改deployment的镜像并记录

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.3 --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx image updated

查看滚动更新过程

[root@k8s-master01 ~]# kubectl rollout status deploy nginx
deployment "nginx" successfully rolled out

或者使用describe查看

[root@k8s-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

[root@k8s-master01 ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-5dfc8689c6   1         1         1       165m
nginx-66bbc9fdc5   0         0         0       21h

滚动更新的策略是:先启动一个新的rs,将副本数设置为1,再把旧的删掉一个,然后再启动一个新的

查看滚动更新策略配置

[root@k8s-master01 ~]# vim nginx-deploy.yaml strategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdat

Deployment的回滚

更新deploy镜像

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:787977da --record
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/nginx image updated[root@k8s-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

查看历史版本

[root@k8s-master01 ~]# kubectl rollout history deploy nginx
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
3         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
4         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
5         kubectl set image deploy nginx nginx=nginx:787977da --record=true

回滚到上一个版本

[root@k8s-master01 ~]# kubectl rollout undo deploy nginx
deployment.apps/nginx rolled back

查看pod,可以看到只剩一个

[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5dfc8689c6-ww9v4   1/1     Running   0          20m

进行多次更新

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:787977da --record
deployment.apps/nginx image updated
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:787977dadaa --record
deployment.apps/nginx image updated
[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:787977xxxxxdadaa --record
deployment.apps/nginx image updated

查看历史记录

[root@k8s-master01 ~]# kubectl rollout history deploy nginx
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
3         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
6         kubectl set image deploy nginx nginx=nginx:1.15.3 --record=true
7         kubectl set image deploy nginx nginx=nginx:787977da --record=true
8         kubectl set image deploy nginx nginx=nginx:787977dadaa --record=true
9         kubectl set image deploy nginx nginx=nginx:787977xxxxxdadaa --record=true

查看指定版本的详细信息

[root@k8s-master01 ~]# kubectl rollout history deploy nginx --revision=6
deployment.apps/nginx with revision #6
Pod Template:Labels:	app=nginxpod-template-hash=5dfc8689c6Annotations:	kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3 --record=trueContainers:nginx:Image:	nginx:1.15.3Port:	<none>Host Port:	<none>Environment:	<none>Mounts:	<none>Volumes:	<none>

回滚到执行的版本

[root@k8s-master01 ~]# kubectl rollout undo deploy nginx --to-revision=6
deployment.apps/nginx rolled back

查看deploy状态

[root@k8s-master01 ~]# kubectl get deploy -oyaml

Deployment扩容和缩容

扩容

[root@k8s-master01 ~]# kubectl scale --replicas=3 deploy nginx
deployment.apps/nginx scaled[root@k8s-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

缩容

[root@k8s-master01 ~]# kubectl scale --replicas=2 deploy nginx
deployment.apps/nginx scaled[root@k8s-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更新暂停功能

[root@k8s-master01 ~]# kubectl rollout pause deployment nginx
deployment.apps/nginx paused

使用set命令修改配置

[root@k8s-master01 ~]# kubectl set image deploy nginx nginx=nginx:1.15.3 --record
Flag --record has been deprecated, --record will be removed in the future# 进行第二次配置变更,添加内存CPU配置
[root@k8s-master01 ~]# kubectl set resources deploy nginx -c nginx --limits=cpu=200m,memory=128Mi --requests=cpu=10m,memory=16Mi
deployment.apps/nginx resource requirements updated

查看deploy

[root@k8s-master01 ~]# kubectl get deploy nginx -oyamlresources:limits:# 容器最大的CPU和内容容量cpu: 200mmemory: 128Mirequests: # 容器启动最小的CPU和内容容量cpu: 10mmemory: 16Mi

查看pod是否被更新

[root@k8s-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没有更新

更新恢复

[root@k8s-master01 ~]# kubectl rollout resume deploy nginx
deployment.apps/nginx resumed

查看rs

[root@k8s-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

[root@k8s-master01 ~]# kubectl get deploy nginx -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: "11"kubernetes.io/change-cause: kubectl set image deploy nginx nginx=nginx:1.15.3--record=truecreationTimestamp: "2021-07-22T08:50:24Z"generation: 20labels:app: nginxname: nginxnamespace: defaultresourceVersion: "1588198"uid: 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:01Z"lastUpdateTime: "2021-07-23T07:48:01Z"message: Deployment has minimum availability.reason: MinimumReplicasAvailablestatus: "True"type: Available- lastTransitionTime: "2021-07-23T08:10:50Z"lastUpdateTime: "2021-07-23T08:10:53Z"message: ReplicaSet "nginx-68db656dd8" has successfully progressed.reason: NewReplicaSetAvailablestatus: "True"type: 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的资源名称是eureka,eureka-0 eureka-1 eureka-2

  • Service:headless service,没有ClusterIP eureka-svc

  • Eureka-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-1;

  • statefulSetName为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和PV

StatefulSet目前使用Headless Service(无头服务)负责Pod的网络身份和通信,需要提前创建此服务。

删除一个StatefulSet时,不保证对Pod的终止,要在StatefulSet中实现Pod的有序和正常终止,可以在删除之前将StatefulSet的副本缩减为0。

创建一个StatefulSet应用

  • 定义一个StatefulSet资源文件

  • 创建一个StatefulSet

定义一个StatefulSet资源文件

[root@k8s-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的StatefulSet,replicas表示部署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

[root@k8s-master01 ~]# kubectl create -f nginx-sts.yaml
service/nginx created
statefulset.apps/web created

查看pod

[root@k8s-master01 ~]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
web-0                    1/1     Running   0          5s
web-1                    1/1     Running   0          3s

查看service

[root@k8s-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

[root@k8s-master01 ~]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled

查看pod

[root@k8s-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,解析无头service

cat<<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: busyboxnamespace: default
spec:containers:- name: busyboximage: busybox:1.28command:- sleep- "3600"imagePullPolicy: IfNotPresentrestartPolicy: Always
EOF

验证StatefulSet

[root@k8s-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

[root@k8s-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 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求护士的心理阴影面积 | 今日最佳

全世界只有3.14 %的人关注了青少年数学之旅&#xff08;图源 叛逆行为艺术&#xff0c;侵权删&#xff09;

RBAC 权限入门

RBAC 权限入门 RBAC概念 RBAC&#xff1a;Role Based Access Control&#xff0c;核心是用户只和角色关联&#xff0c;而某角色可以拥有各种各样的权限并可继承。 RBAC白话介绍 RBAC有很多模型&#xff0c;最简单的就是Core RBAC。说白了就是User用户, Role角色, Permission许可…

华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文

华为笔记本电脑的外型真的很时尚&#xff0c;以及其轻薄便捷的特色&#xff0c;迅速吸引力一大波粉丝。目前的华为笔记本电脑使用的操作系统基本是win10系统了&#xff0c;win10系统升级经常出现错误&#xff0c;下面小编就给你讲解下U盘重装win10的方法。喜欢完游戏的朋友来说…

设计模式之建造者

建造者(生成器)模式含义&#xff1a;生成器模式是一种创建型模式&#xff0c;使你能够分步奏创建复杂对象&#xff0c;可使用相同的创建代码生成不同类型和形式的对象。看图我们就能很好地理解&#xff0c;图中就是工厂中的流水线模式&#xff0c;建造者就好比整条流水线&#…

索尼服务器维护时间,索尼云服务器

索尼云服务器 内容精选换一换如果密码丢失、或创建时未设置密码&#xff0c;推荐您在控制台设置登录密码。更新后端云服务器&#xff0c;可修改字段为后端云服务器的名称和权重&#xff0c;可以为性能好的服务器设置更大的权重&#xff0c;用来接收更多的流量。如果后端云服务器…

刚刚,陶哲轩惨遭3个物理学家狠狠打脸,一条数学公式或将引起教科书改革

这波操作把数学界都炸懵了就在刚刚&#xff0c; 3 位物理学家联合数学天才、菲尔兹奖得主陶哲轩&#xff0c;彻底炸翻了数学界。左往右&#xff0c;彼得丹顿、斯蒂芬帕克、张西宁彼得丹顿&#xff08;Peter B.Denton&#xff09;&#xff0c;美国布鲁克黑文国家实验室的助理物理…

教材管理系统紧张开发中

教材管理系统紧张开发中&#xff0c;系统也许不大&#xff0c;可是业务比较复杂、交叉性很强&#xff0c;教学计划、课程代码、教材、供货商、分校点、系部、教师、学生、库存、盘点、结算、数据采集、征订、订购、分发、收费一个都不能少&#xff01;既有C/S三层又有Web模式&a…

Blazor 组件之间使用 EventCallback 进行通信

翻译自 Waqas Anwar 2021年3月28日的文章 《Communication between Blazor Components using EventCallback》 [1]Blazor 应用程序是相互交互的多个 Blazor 组件的集合&#xff0c;我们可以在其他父组件中使用子组件。在实际的应用程序中&#xff0c;将数据或事件信息从一个组件…

***教程十:数据库注入(上)

这一段的教程是笔者&#xff08;这里应该叫整理者&#xff09;由《***X档案》的教程中整理改编而来。不知道是什么时候&#xff0c;B/S结构的软件越来越普及。工程师们为了应对“用户皆白痴”的服务理念&#xff08;就是把用户想像成什么都不会&#xff09;&#xff0c;所以更加…

服务器精益改善系列,精益生产改善的内容是什么?

精益生产管理改善的内容包含了生产管理过程中的方方面面&#xff0c;如果可以准确理解的话&#xff0c;请从以下三个方面来理解&#xff1a;首先是精益生产管理六大产出&#xff0c;即PQCDSM&#xff0c;就是精益生产管理改善的第一层内容。其中PQCDSM分别代表了P&#xff1a;P…

当代大学查寝奇葩操作大赏 | 今日最佳

全世界只有3.14 %的人关注了青少年数学之旅&#xff08;图源 阿粪青&#xff0c;侵权删&#xff09;

mysql学习笔记之mysqlparameter(摘)

在.net中操作数据库的时候。 大家都喜欢用sqlparameter。 parameter是预编译的&#xff0c;可以加快速度&#xff0c;也可以防注入。 在使用mssql的时候用sqlparameter。 在使用mysql的时候使用mysqlparameters。 第一次使用mysql的时候&#xff0c;都经常犯一个错误 比如在使用…

.net LTS3.1升5.0和LTS6.0隐蔽的坑

下面这段代码就是把ascll为0到127值 &#xff0c;转成string&#xff0c;并判断在字符串中的位置&#xff0c;第5&#xff0c;6行代码分别用了两种IndexOf方法的重载。for (var i 0; i < 128; i) {var str1 ((char)i).ToString();var str2 $"---------------{str1}-…

Java正则表达式获取网页所有网址和链接文字

/*获取网址首页的所有网址和链接文字*/import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.Lis…

学习烂到留级,却凭着正经发表的第一篇论文,优雅斩获诺贝尔奖

全世界只有3.14 %的人关注了青少年数学之旅照片里的男人&#xff0c;得意但很谦逊&#xff0c;他是诺贝尔化学奖创设以来最年轻得主——田中耕一。诺贝尔奖通知的那一天 叮铃叮铃叮铃......正在加班的田中耕一掏出手机&#xff0c;这是一个陌生的跨洋电话。电话那头的外国人…

CakePHP Pagination (分頁功能) 加入自己的參數

如果還不知道什麼是 Pagination 或者還不了解如何使用&#xff0c;請參考&#xff1a; CakePHP Pagination (分頁功能) 。通常在管理後台實作時&#xff0c;常設定許多查詢條件來查詢資料&#xff0c;比如&#xff1a;起始、結束時間。通常這些參數都是用GET的方式在傳遞。以下…

基于事件驱动架构构建微服务第2部分:领域对象和业务规则

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part2-domain-objects-and-business-rules/在本文中&#xff0c;我将实现领域模型&#xff1a;EduSync.Speech.Domain这是包含核心域的最内层。它包含我们的领域对象和业…

qt客户端连接服务器不响应,qt判断tcp客户端是否连接服务器

qt判断tcp客户端是否连接服务器 内容精选换一换本章节指导您使用MongoDB客户端&#xff0c;通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例。操作系统使用场景&#xff1a;弹性云服务器的操作系统以Linux为例&#xff0c;客户端本地使用的计算机系统以Windows为例。目…

谈谈为什么我们需要云原生架构?

未来的软件&#xff0c;从诞生起&#xff0c;就是生在云上&#xff0c;长在云上的。这个说法绝对不是没有根据的&#xff0c;看看现在的互联网大厂在做的事情&#xff0c;你就知道了&#xff1a;阿里宣布成立云原生技术委员会&#xff0c;并投入数十亿大力推动阿里经济体全面云…

服务器系统设计方案,服务器集群方案设计

当前主流的集群方式包括以下几种&#xff1a;1.服务器主备集群方式服务器主-备方式由一台服务器在正常运行状态提供对外服务&#xff0c;其它集群节点作为备份机&#xff0c;备份机在正常状态下不接受外部的应用请求&#xff0c;实时对生产机进行检测&#xff0c;当生产机停机时…