1. Pod基础管理

由于k8s时使用namespace隔离,所以要查看具体pod信息时,必须加上对应的namespace区间
kubectl describe pod coredns-7f6cbbb7b8-nz9cn -n kube-system
pod也可以随时创建和回收,在手动删除pod时:kubectl delete pod *** -n kube-system时,会自动重启,对于故障pod可尝试该方法排错

1.1 Pod建立,删除,查看

  • Pod时可以创建和管理k8s计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个Pod都有一个唯一的IP
  • 一个Pod类似一个碗豆荚,包含一个或多个容器(通常是Docker),多个容器间共享IPC,Network和UTC namespace

此时在server1上提前准备好了harbor仓库,并包含myapp:v1,v2版本:
请添加图片描述

创建一个Pod,使用myapp:v1镜像;kubectl run nginx --image=myapp:v1
由于在创建Pod的时后并未指定namespace,所以创建位置在默认里
请添加图片描述
查看Pod详细信息:kubectl get pod -o wide
请添加图片描述
一般server2作为调度节点不会参与部署,此处不同于swarm;
此时,该Pod只能在集群内部访问,集群内部也可互相访问
此时,在harbor中准备busyboxplus并运行:kubectl run demo --image=busyboxplus -it
请添加图片描述
若pod内只有一个容器,再次进入该pod内的容器可执行:kubectl attach demo -it
删除容器:kubectl delete pod nginx

1.2 通过控制器创建Pod

生产环境用控制器较多,扩容缩容必须基于service控制器
创建:kubectl create deployment nginx --image=myapp:v1
此时,如果删除创建的Pod,则会自动创建一个新的Pod,控制器和rs不变,变的是容器id,可随时创建和回收:
请添加图片描述
对该应用拉伸:kubectl scale deployment --replicas=2 nginx
在这里插入图片描述
因为使用了私有仓库,所以在拉伸时速度很快:
请添加图片描述

  • seervice是一个抽象概念,定义了一个服务的多个Pod逻辑合集和访问Pod的策略,一般把service称为微服务(例如实现集群负载均衡)
  • 暴露端口:kubectl expose deployment nginx --port=80
  • 此时Pod客户端可以通过service的名称访问后端的3个Pod
  • ClusterIP:默认类型,自动分配一个仅集群内部可以副访问的虚拟IP,包括其他加入集群的虚拟机
  • 查看创建的服务(查看其中服务暴露的端口):kubectl get svc
    请添加图片描述
    解析该服务IP,可看到已实现负载均衡:curl 10.107.23.70/hostname.html
    请添加图片描述
    若查看服务的具体细节:kubectl get svc nginx
    请添加图片描述
    可看到,其中包含的3个IP地址即为内部3个容器的地址

若要被集群外部访问,使用Nodeort类型暴露端口,让外部客户端访问Pod

  • 需要更改svc类型:kubectl edit svc nginx
    请添加图片描述
    请添加图片描述
  • NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:Nodeort来访问服务
  • 在真机上,通过虚拟机IP地址加查询暴露的端口号即可访问:
    请添加图片描述

1.3 更新Pod镜像与回滚

更新镜像:kubectl set image deployment nginx myapp=myapp:v2
回滚:

  • 查看历史版本:kubectl rollout history deployment nginx
    请添加图片描述
  • 回滚:kubectl rollout undo deployment nginx --to-revision=1

2. 资源清单

删掉上节的deployments中的nginx,和svc中的nginx
查看api版本:kubectl api-versions
请添加图片描述

2.1 创建Pod清单

请添加图片描述

请添加图片描述

创建Pod提示:kubectl explain pod

首先编写一个简单的清单,除了指定api,类型,镜像拉取策略选择如果本地有就不从仓库拉取:

vim pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
spec:
  containers:
  - name: nginx
    image: myapp:v1
    imagePullPolicy: IfNotPresent

执行清单:kubectl apply -f pod.yml
请添加图片描述
由于Pod没有控制器,所以在删除时,执行删除命令即可:kubectl delete -f pod.yml
好处是可以通过文件重复利用

2.2 创建Deployment清单

查看创建清单(例如spec)帮助:kubectl explain deployment.spec

vim -f pod.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent

执行清单:kubectl apply -f pod.yml
此时,若要对镜像升级,只需要修改pod.yml文件中的镜像版本部分即可,然后在此执行yml文件,拉伸等同理。
若想快速获得部分清单内容,可将正在运行的类似服务导出yaml格式:kubectl deployments.apps -nginx -o yaml

请添加图片描述
此外,还可以指定容器的资源控制的上下限:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 100Mi         
            limits:
              cpu: 0.5
              memory: 512Mi

请添加图片描述
查看节点标签:kubectl show nodes --show-labels
请添加图片描述
将所有Pod都放在指定节点上,可使用主机名或k8s标签:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      nodeSelector:
        kubernetes.io/hostname: server4
      #nodeName: server3
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent

也可进一步设置网络为node节点IP:

	  #nodeSelector: 
      #  kubernetes.io/hostname: server4    
      #nodeName: server4![请添加图片描述](https://img-blog.csdnimg.cn/6b3e645e5adb4b689808d3683ce33037.png)

      hostNetwork: true

请添加图片描述
包含两个镜像的pod,其中增加的busybox打开交互式访问:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      #nodeSelector: 
      #  kubernetes.io/hostname: server4    
      #nodeName: server3
      hostNetwork: true
      containers:
      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 0.5
            memory: 512Mi
      - name: busyboxplus
        image: busyboxplus
        imagePullPolicy: IfNotPresent
        stdin: true
        tty: true

请添加图片描述
若要连接:kubectl attach nginx-597468cf8f-6zpgg -c busyboxplus -it
此时,进到该容器内部,是可以看到本机的发布目录的,由另一个容器myapp发布:
请添加图片描述
即证明了同一pod内的资源包括网络是共享的
但是若两个容器的IP占用冲突:

      - name: nginx
        image: myapp:v1
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 0.5
            memory: 512Mi
      - name: busyboxplus
        image: busyboxplus
        imagePullPolicy: IfNotPresent
        stdin: true
        tty: true
      - name: game2048
        image: game2048
        imagePullPolicy: IfNotPresent

则运行时最终会报错:
请添加图片描述
查看错误日至,端口已被占用:
请添加图片描述
Node节点标签的添加,修改和删除:
查看Node节点标签:kubectl get nodes server3 --show-labels
添加:kubectl label nodes server3 app=nginx
修改:kubectl label nodes server3 app=myapp --overwrite
删除:kubectl label nodes server3 app-

Pod节点也可以设置标签:
查看:kubectl get pod --show-labels
请添加图片描述
个人理解,打标签时为了更方便的管理Node和Pod

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐