k8s 创建redis pod k8s 创建pod命令_nginx

一、创建pod的两种方式

1.命令方式

①创建命令:

#kubectl run kubia --image=luksa/kubia --replicas=3

②查看资源:

#kubectl get pod -o wide

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_02


2.文件方式

#vim nginx-master.yaml

apiVersion: extensions/v1beta1  #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                #创建资源类型为Deployment
metadata:                       #该资源元数据
  name: nginx-master            #Deployment名称
spec:                           #Deployment的规格说明
  replicas: 3                   #指定副本数为3
  template:                     #定义Pod的模板
    metadata:                   #定义Pod的元数据
      labels:                   #定义label(标签)
        app: nginx              #label的key和value分别为app和nginx
    spec:                       #Pod的规格说明
      containers:               
      - name: nginx             #容器的名称
        image: nginx:latest     #创建容器所使用的镜像

①执行创建命令

#kubectl create -f nginx-master.yaml

k8s 创建redis pod k8s 创建pod命令_nginx_03


②查看创建的资源

#kubectl get deployments -o wide

k8s 创建redis pod k8s 创建pod命令_html_04


#kubectl get pod

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_05

二、进入pod

进入pod kubia-66c8b6d4fc-qhsrd(master节点)
#kubectl exec -it kubia-66c8b6d4fc-qhsrd bash

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_06

三、标签

标签其实就是一对key/value,可以附加到资源的任意键值对,标签可以用来划分特定组的对象,用以选择具有改确切标签的资源。

1.pod使用标签

①pod指定标签

#kubectl run http-label --image=httpd --labels=“app=web,env=prod”

k8s 创建redis pod k8s 创建pod命令_html_07


②查看pod的标签

#kubectl get pod -l app --show-labels

使用标签筛选pod,通过-l app参数可筛选所有标签为app的pod

k8s 创建redis pod k8s 创建pod命令_nginx_08


③修改现有标签

#kubectl label pod http-label-7cf498876f-59mws env=debug --overwrite

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_09


#kubectl get pod --show-labels

k8s 创建redis pod k8s 创建pod命令_nginx_10


④删除标签

#kubectl label pod http-label-7cf498876f-59mws env-

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_11


2.通过标签指定pod创建的节点

给node节点打标签

#kubectl label nodes master node=master

#kubectl label nodes node1 node=node1

#kubectl label nodes node2 node=node2

指定node创建pod

#vim httpd-node.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd-node
spec:
  template:
    metadata:
      labels:
        env: prod
    spec:
      containers:
      - name: httpd-node
        image: httpd:latest
      nodeSelector:
        node: master

执行创建命令

#kubectl apply -f httpd-node.yaml

k8s 创建redis pod k8s 创建pod命令_nginx_12

四、命名空间

Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default)

1.查看命名空间

#kubectl get ns

k8s 创建redis pod k8s 创建pod命令_Deployment_13


2.查看指定命名空间的pod

#kubectl get pod --namespace=default

#kubectl get pod -n kube-system

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_14


3.创建命名空间

文件方式创建test01-namespace.yaml

#vim /data/shell/test01-namespace.yaml

apiVersion: v1
kind: Namespace
metadata: 
  name: test01-namespace

执行创建命令

①#kubectl apply -f test01-namespace.yaml

k8s 创建redis pod k8s 创建pod命令_html_15


命令方式:

②#kubectl create ns test02-namespace

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_16


4.pod指定命名空间

①指定创建pod的命名空间为test01-namespace

#kubectl run httpd --image=httpd -n test01-namespace

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_17


②查询pod

#kubectl get pods -n test01-namespace

k8s 创建redis pod k8s 创建pod命令_nginx_18


③命名空间切换

#alias kcd=‘kubectl config set-context $(kubectl config current-context) --namespace’

#kcd test01-namespace

k8s 创建redis pod k8s 创建pod命令_html_19

五、扩容/缩容

创建文件nginx-scale.yaml并新建资源

apiVersion: extensions/v1beta1  #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment                #创建资源类型为Deployment
metadata:                       #该资源元数据
  name: nginx-scale             #Deployment名称
spec:                           #Deployment的规格说明
  replicas: 3                   #指定副本数为3
  template:                     #定义Pod的模板
    metadata:                   #定义Pod的元数据
      labels:                   #定义label(标签)
        env: prod               #label的key和value分别为app和nginx
    spec:                       #Pod的规格说明
      containers:
      - name: nginx-scale       #容器的名称      
        image: nginx:latest     #创建容器所使用的镜像

①执行创建

#kubectl -apply -f nginx-scale.yaml

k8s 创建redis pod k8s 创建pod命令_nginx_20


②查看资源

k8s 创建redis pod k8s 创建pod命令_nginx_21


③文件方式扩容:通过修改文件中参数replicas的值并重新执行kubectl apply命令即可实现pod的扩缩容

k8s 创建redis pod k8s 创建pod命令_nginx_22


④命令方式

#kubectl scale deployment nginx-scale --replicas=1

k8s 创建redis pod k8s 创建pod命令_html_23

六、failover

1.pod节点分布查看

#kubectl get pod -o wide --all-namespaces

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_24


2.faillover测试

节点node2关机

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_25


查看node状态和pod分布

#kubectl get pod -o wide --all

k8s 创建redis pod k8s 创建pod命令_html_26


node2状态为NotReady且之前在该节点的pod被迁移至master或者node1.当node2恢复后,运行在该节点的Pod会被删除,且迁移至master和node1的Pod不会重新调度回到node2。

七、升级及回滚

1.创建deployment
#vim nginx-roll.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-roll
  namespace: test02-namespace
spec:
  selector:
    matchLabels:
      env: prod
  replicas: 3
  template:
    metadata:
      labels:
        env: prod
    spec:
      containers:
      - name: nginx-roll
        image: nginx:1.16

创建deployment nginx-roll,副本数为3,namespace为test02-namespace,nginx版本为1.16,–record参数会记录历史版本号。

#kubectl apply -f nginx-roll.yaml --record

查看部署资源pod

k8s 创建redis pod k8s 创建pod命令_html_27


2.升级

升级的方式有多种,比如[kubectl edit deployments -n test02-namespace nginx-roll]方式,直接修改nginx-roll.yaml文件、kubectl set image方式等。

①修改文件方式

#sed -i ‘s/image: nginx:1.16/image: nginx:1.17/g’ nginx-roll.yaml

#kubectl apply -f nginx-roll.yaml --record

k8s 创建redis pod k8s 创建pod命令_Deployment_28


#kubectl rollout status deployment -n test02-namespace nginx-roll

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_29


②kubectl set image方式

#kubectl set image deployment -n test02-namespace nginx-roll nginx-roll=nginx:1.17.5

3.回滚

①查看deployments版本

#kubectl rollout history deployments -n test02-namespace nginx-roll

k8s 创建redis pod k8s 创建pod命令_nginx_30


②查看deployment具体版本信息

#kubectl rollout history deployments -n test02-namespace nginx-roll --revisinotallow=1

k8s 创建redis pod k8s 创建pod命令_Deployment_31


③回滚至上一个版本

#kubectl rollout undo deployment -n test02-namespace nginx-roll

k8s 创建redis pod k8s 创建pod命令_nginx_32


④查看

#kubectl rollout status deployment -n test02-namespace nginx-roll

k8s 创建redis pod k8s 创建pod命令_nginx_33


⑤回滚至指定版本

#kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revisinotallow=1

k8s 创建redis pod k8s 创建pod命令_Deployment_34


⑥查看

k8s 创建redis pod k8s 创建pod命令_html_35


k8s 创建redis pod k8s 创建pod命令_Deployment_36

⑦查看Replicasets

#kubectl get replicasets -n test02-namespace -o wide

k8s 创建redis pod k8s 创建pod命令_nginx_37


可以看到升级过程中replicaset保留了修改的历史版本信息。

八、内网访问

1.创建pod
#vim web-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: web-svc
  namespace: test02-namespace
spec: 
  selector: 
    matchLabels: 
        app: web-svc
  replicas: 3
  template: 
    metadata: 
      labels: 
        app: web-svc
    spec: 
      containers: 
      - name: web-svc
        image: httpd:latest

#kubectl apply -f web-svc.yaml

k8s 创建redis pod k8s 创建pod命令_Deployment_38


2.内网访问

创建service

#vim web-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: test02-namespace
spec:
  selector:
    app: web-svc
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

①创建内网service

#kubectl apply -f web-svc.yaml

②查看创建的service

#kubectl get service -n test02-namespace

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_39


③修改index.html

k8s 创建redis pod k8s 创建pod命令_Deployment_40

master节点:echo '<html><body><h1>It works!web-svc-58956c55fc-z6msf</h1></body></html>'>index.html 
node1节点:echo '<html><body><h1>It works!web-svc-58956c55fc-dw5kk</h1></body></html>'>index.html
node2节点:echo '<html><body><h1>It works!web-svc-58956c55fc-bcpbx</h1></body></html>'>index.html

④内网访问pod

#for i in {1…10};do sleep 1;curl 10.102.203.64:8080;done

k8s 创建redis pod k8s 创建pod命令_html_41


3.外网访问

修改service

新增’type: NodePort’和’nodePort: 30002’,通过NodePort方式外网访问pod,映射端口为30002,重新kubectl apply。(参考内网访问)

apiVersion: v1
kind: Service
metadata:
  name: web-svc
  namespace: test02-namespace
spec:
  type: NodePort
  selector:
    app: web-svc
  ports:
  - protocol: TCP
    nodePort: 30002
    port: 8080
    targetPort: 80

外网访问pod

#for i in {1…10};do sleep 1;curl 192.168.3.183:30002;done

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_42

九、日志查看

使用kubectl logs命令可获取pod日志

1.查看最近的日志

#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --tail=20

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_43


‘–tail=20’:查看命名空间test02-namespace下web-svc-58956c55fc-bcpbx最近20行的日志,

2.查看前一个容器的日志

#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --previous

3.通过标签查看日志

#kubectl logs -lapp=web

查看标签为‘app=web’的日志;’-lapp=web’该日志是标签为’app=web’的合集

k8s 创建redis pod k8s 创建pod命令_nginx_44

十、删除pod

1.通过删除deployment删除pod

通过deployment创建pod可以直接删除deployment

#kubectl delete deployments kubia

k8s 创建redis pod k8s 创建pod命令_html_45


2.通过删除namespace删除pod

①删除namespace中所有资源

#kubectl delete all --all -n test01-namespace

k8s 创建redis pod k8s 创建pod命令_Deployment_46


②直接删除namespace

#kubectl delete ns test01-namespace

k8s 创建redis pod k8s 创建pod命令_k8s 创建redis pod_47


总结:

直接删除pod会重建一个新的不同名的pod;

直接删除replicasets会重建同名replicasets,其下所有pod则会删除重建且名字不同;

直接删除deployments则其下的replicasets和pod将一起被删除;