但是在 kubernetes 中,Pod 的 IP 地址会随着 Pod 的重启而变化,并不建议直接拿 Pod 的 IP 来交互。 使用Service可以解决这个问题, Service 为一组 Pod(通过 labels 来选择) 提供一个统一的入口,并为它们提供负载均衡和自动服务发现。
kubectl expose
将资源暴露为新的Kubernetes Service。
指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。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.
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
- 本文链接: http://hjwblog.com/archives/k8s使用service
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!