kubenetes创建一个pod应用

 Pod是可以创建和管理Kubernetes计算的最小可部署单元。一个Pod代表着集群中运行的一个进程。每个pod都有一个唯一的ip。

一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace

Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

创建一个pod应用

kubectl  run -h  查看run命令的用法

master01 # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1  --record
              控制器名称 容器镜像           容器的端口  pod的数量 在Deployment revision中可以查看到执行的历史命令

查看

[master01 ]# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-55d8d67cf-kckf9   1/1     Running   0          2m55s   10.244.1.3   node01   <none>           <none>
可以看到pod已经运行在一个工作节点上, 这里的ip是cni0桥的ip
[node01] # ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.1.1  netmask 255.255.255.0  broadcast 0.0.0.0 

 在集群内部任意的节点可以访问pod。集群外部无法直接访问pod

 删除pods     查看会看到自动起来另一个,因为 replicas个数为1

# kubectl delete pod nginx-deploy-55d8d67cf-kckf9
pod "nginx-deploy-55d8d67cf-kckf9" deleted
# kubectl get pods -o wide
NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deploy-55d8d67cf-lf5xb   1/1     Running   0          2m55s   10.244.1.3   node01   <none>           <none>

service

service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。

举个例子:a服务运行3个pod,b服务怎么访问a服务的pod,pod的ip都不是持久化的重启之后就会有变化。
这时候b服务可以访问跟a服务绑定的service,service信息是固定的提前告诉b就行了,service通过Label Selector跟a服务的pod绑定,无论a的pod如何变化对b来说都是透明的。

创建service 

kubectl  expose  -h  查看命令的用法

# kubectl expose deployment nginx-deploy --name=nginx80 --port=80 --target-port=80 --protocol=TCP
service_name service_port pod_port service
/nginx exposed

查看service

# kubectl get svc -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE     SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          26d     <none>
nginx80      ClusterIP   10.105.125.134   <none>        80/TCP           118s    run=nginx-deploy

 pod客户端访问可以使用 service_name:service_port 访问pod。  说明service可以为pod提供固定访问端点。

# kubectl run client --image=busybox --replicas=1 -it --restart=Never

 \# wget -O - -q http://nginx:80 可以访问到pod 

 kubectl describe svc nginx    查看service详细信息

 

  • selector:run=nginx-deploy 标签选择器,pod被删除掉,访问nginx:80依然能访问到。kubectl get pods --show-labels 查看标签
  • endpoints可以看到后端pod资源

实践:

创建两个pod

# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl get pods -o wide 

 

创建一个service

# kubectl expose deployment myapp --port=8000 --target-port=80

查看svc

# kubectl describe svc myapp
Name:              myapp
Namespace:         default
Labels:            run=myapp
Annotations:       <none>
Selector:          run=myapp
Type:              ClusterIP
IP:                10.99.71.37       
Port:              <unset>  8000/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.35:80,10.244.1.36:80  #service后端的两个pod
Session Affinity:  None
Events:            <none>

 创建一个pod客户端访问service_name:service_port,可以看到service是随机的将请求分发到后端的两个pod的

# kubectl run client --image=busybox -it 

/ # wget -O - -q http://myapp:8000/hostname.html

  

使外部客户端可以访问pod

 如果端口暴露类型为NodePort,那么可以通过集群内任意一台主机ip加暴露的端口进行访问

1. #  kubectl edit svc myapp   修改service的type为NodePort

  ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
  NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过  NodeIP:NodePort 来访问该服务

2. 也可以在创建service时指定type

 kubectl expose deployment nginx-deploy  --name=nginx   --port=80 --target-port=80 --type=NodePort

 # kubectl get svc -o wide

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        26d   <none>
nginx80      NodePort    10.105.125.134   <none>        80:32441/TCP   35m   run=nginx-deploy

使用集群外客户端访问,需要使用集群任意一个节点的IP地址加上暴露的端口号

动态扩容缩容

  kubectl scale --replicas=5 deployment  nginx-deploy     # replicas指定pod数即可 

升级镜像

 将镜像升级为1.16-alpine:

# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.16-alpine  --record
deployment.extensions/nginx-deploy image updated

另开一个窗口监控升级过程:
# kubectl get pod -w

  升级完成后查看:

# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-56457775df-ptx9f   1/1     Running   0          2m25s
# kubectl get deployment
-o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deploy 1/1 1 1 23d nginx-deploy nginx:1.16-alpine run=nginx-deploy

# kubectl describe pod nginx-deploy-56457775df-ptx9f

  

回滚操作

# kubectl rollout undo deployment/nginx-deploy
deployment.extensions/nginx-deploy rolled back

--to-revision 参数可以指定回退的版本

# kubectl rollout undo deploy/nginx-deploy --to-revision=1

# kubectl rollout history deployment/nginx-deploy     #查看历史版本

这里CHANGE-CAUSE显示为空是因为操作deployment的时候没有加--record。如果加上应该显示:

猜你喜欢

转载自www.cnblogs.com/xiaobaozi-95/p/11607834.html