但是在 kubernetes 中,Pod 的 IP 地址会随着 Pod 的重启而变化,并不建议直接拿 Pod 的 IP 来交互。 使用Service可以解决这个问题, Service 为一组 Pod(通过 labels 来选择) 提供一个统一的入口,并为它们提供负载均衡和自动服务发现。

kubectl expose

将资源暴露为新的Kubernetes Service。

指定deployment、service、replica setreplication controllerpod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。

语法

$ expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]

比如,可以为前面的 nginx-app 创建一个service:

$ kubectl expose deployment nginx-app --port=80 --target-port=80 --type=NodePort
service "nginx-app" exposed

查看service信息。

$ kubectl describe service nginx-app
Name:			nginx-app
Namespace:		default
Labels:			run=nginx-app
Selector:		run=nginx-app
Type:			NodePort
IP:			10.254.30.106
Port:			<unset>	80/TCP
NodePort:		<unset>	31069/TCP
Endpoints:		172.17.0.2:80
Session Affinity:	None
No events.

然后就可以使用访问nginx.

image20200408205308813.png

image20200408205405561.png

kubectl scale

扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。

scale也可以指定多个前提条件,如:当前副本数量或 --resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。

通过修改 Deployment 中副本的数量(replicas),可以动态扩展或收缩应用。这些自动扩展的容器会自动加入到 service 中,而收缩回收的容器也会自动从 service 中删除。

$ kubectl scale --replicas=3 deployment/nginx-app
deployment "nginx-app" scaled
$ kubectl get deploy
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-app   3         3         3            3           3d
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
nginx                        1/1       Running   0          3d
nginx-app-2007220645-24w6n   1/1       Running   0          10h
nginx-app-2007220645-6f66z   1/1       Running   0          4d
nginx-app-2007220645-8mjdk   1/1       Running   0          10h

kubectl rolling-update

执行指定ReplicationController的滚动更新。

该命令创建了一个新的RC, 然后一次更新一个pod方式逐步使用新的PodTemplate,最终实现Pod滚动更新。

$ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2

在滚动升级的过程中,如果发现了失败或者配置错误,还可以随时回滚:

$ kubectl rolling-update frontend-v1 frontend-v2 --rollback

需要注意的是,kubectl rolling-update 只针对 ReplicationController。对于更新策略是 RollingUpdate 的 Deployment(Deployment 可以在 spec 中设置更新策略为 RollingUpdate,默认就是 RollingUpdate),更新应用后会自动滚动升级:

spec:
    replicas: 3
    selector:
      matchLabels:
        run: nginx-app
    strategy:
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 1
      type: RollingUpdate

kubectl set

配置应用资源。

使用这些命令能帮你更改现有应用资源一些信息。

子命令

  • image
  • resources
  • selector
  • subject

而更新应用的话,就可以直接用 kubectl set 命令:

$ kubectl set image deployment/nginx-app nginx-app=nginx:1.9.1
deployment "nginx-app" image updated

kubectl rollout

滚动升级的过程可以用 rollout 命令查看:

$ kubectl rollout status deployment/nginx-app
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...

这里我的卡住了

$ kubectl get pods
NAME                         READY     STATUS             RESTARTS   AGE
nginx                        1/1       Running            0          3d
nginx-app-2007220645-24w6n   1/1       Running            0          10h
nginx-app-2007220645-6f66z   1/1       Running            0          4d
nginx-app-616742947-97f9h    0/1       ImagePullBackOff   0          19m
nginx-app-616742947-j62g8    0/1       ErrImagePull       0          19m

pull镜像的时候失败

$ kubectl describe pod
......
  18m		3m		5	{kubelet 127.0.0.1}	spec.containers{nginx-app}	Warning		FailedFailed to pull image "nginx:1.9.1": net/http: request canceled
  18m		3m		5	{kubelet 127.0.0.1}					Warning		FailedSync		Error syncing pod, skipping: failed to "StartContainer" for "nginx-app" with ErrImagePull: "net/http: request canceled"

  18m	1m	23	{kubelet 127.0.0.1}	spec.containers{nginx-app}	Normal	BackOff		Back-off pulling image "nginx:1.9.1"
  18m	1m	23	{kubelet 127.0.0.1}					Warning	FailedSync	Error syncing pod, skipping: failed to "StartContainer" for "nginx-app" with ImagePullBackOff: "Back-off pulling image \\"nginx:1.9.1\\""

  19m	49s	6	{kubelet 127.0.0.1}	spec.containers{nginx-app}	Normal	Pulling	pulling image "nginx:1.9.1"

最后设置了代理,拉取成功。

$ kubectl rollout status deployment/nginx-app
deployment "nginx-app" successfully rolled out
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
nginx                        1/1       Running   0          3d
nginx-app-2007220645-24w6n   1/1       Running   0          10h
nginx-app-2007220645-6f66z   1/1       Running   0          4d
nginx-app-2007220645-8mjdk   1/1       Running   0          10h