k8s添加pod,k8常用命令,k8s删除pod


添加pod测试
创建deployment
kubectl create deployment nginx(pod名称)–image=nginx
创建后查看:kubectl get deployment
在这里插入图片描述

放开端口
kubectl expose deployment nginx --por=80 type=NodePort
在这里插入图片描述
查看服务端口:32079
k8s添加pod,k8常用命令,k8s删除pod_第1张图片
可以通过集群任一ip地址(master或者node节点)
ip地址:32079访问部署的nginx
k8s添加pod,k8常用命令,k8s删除pod_第2张图片
deployment扩容pod
k8s添加pod,k8常用命令,k8s删除pod_第3张图片

kubectl create部署web项目

该方法比较麻烦,需要手动更新镜像等,查不到更新历史记录
准备war包,和Dockerfile放在同一个目录中
在这里插入图片描述

vim Dockerfile
k8s添加pod,k8常用命令,k8s删除pod_第4张图片
创建镜像
k8s添加pod,k8常用命令,k8s删除pod_第5张图片
修改镜像tag:docker tag
登录远程镜像仓库:docker login
在这里插入图片描述
推送至远程仓库:docker push
在这里插入图片描述
k8s运行镜像
kubectl create deployment jpresstest(pod名称)–image=jpress:v1
或者创建yaml文件配置
k8s添加pod,k8常用命令,k8s删除pod_第6张图片
放开端口32080
kubectl expose deployment jpresstest --por=8080 type=NodePort
或者创建yaml文件配置
kubectl get svc
访问报错
k8s添加pod,k8常用命令,k8s删除pod_第7张图片
查看pod状态有问题kubectl get pod
k8s添加pod,k8常用命令,k8s删除pod_第8张图片

进入pod(1个pod只有1个docker容器)
kubectl exec -it jpresstest-9c7c97fbc-lb67 – /bin/bash
k8s添加pod,k8常用命令,k8s删除pod_第9张图片
进入pod(1个pod有多个docker容器)
kubectl exec -it jpresstest-9c7c97fbc-lb67 --container main-app – /bin/bash
容器中没有对应的文件
更新镜像文件:
先运行镜像docker run -d -p jpress:v1
进入运行镜像创建的容器:docker exec -it 容器id /bin/bash
调整好容器内部的内容
退出该容器内部
提交该容器:docker commit 容器id jpress:v2
在这里插入图片描述
提交后修改该容器tag并提交至阿里云仓库,版本记录为v2
滚动更新k8s集群的pod版本:kubectl set image deploy/ <容器名称>=<镜像名称:版本号> --record
在这里插入图片描述

更新过程:
k8s添加pod,k8常用命令,k8s删除pod_第10张图片
最终结果:
k8s添加pod,k8常用命令,k8s删除pod_第11张图片

查看k8版本
kubectl api-versions
v1:Kubernetes API的稳定版本,包含很多核心对象:pod、service等
apps/v1:在kubernetes1.9版本中,引入apps/v1,deployment等资源从extensions/v1beta1, apps/v1beta1 和 apps/v1beta2迁入apps/v1,原来的v1beta1等被废弃。
apps/v1代表:包含一些通用的应用层的api组合,如:Deployments, RollingUpdates, and ReplicaSets
k8s添加pod,k8常用命令,k8s删除pod_第12张图片

nfs共享存储

pod的生命周期短暂,会被频繁的创建和销毁。当pod被销毁时,pod内的文件系统也会被销毁,所以为了解决这个问题,k8s提供了Volume。
Volume的生命周期独立于pod容器。当pod不在存在时,k8s会销毁临时卷。但对于持久卷,k8s在pod重启期间不会进行销毁
持久卷的核心是一个目录,任何pod的容器都可以访问该目录中的数据。
nfs作用:
多节点共享存储
独立于pod的文件服务器
文件服务器搭建
nfs搭建(分服务端和客户端):
三台主机:master node1 node2
搭建在node2主机。
centos7只安装nfs-utils

yum -y install nfs-utils rpcbind

随意找个路径放置nfs存储路径
mkdir /home/nfs/
编辑/etc/exports文件添加需要共享目录,每个目录的设置独占一行,编写
/usr/local/nfs 192.168.0.0/16(rw,sync)
同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中
rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据

设置共享目录生效
exportfs -r

启动nfs

systemctl start rpcbind.service
systemctl enable rpcbind.service

systemctl start nfs.service
systemctl enable nfs.service

在这里插入图片描述

确认NFS服务器启动成功:
rpcinfo -p

检查 NFS 服务器是否挂载我们想共享的目录 usr/local/nfs:
exportfs
在这里插入图片描述
检查nfs服务是否能正常访问
showmount -e node2ip地址
-e:显示NFS服务器上所有的共享目录
在这里插入图片描述
启动客户端rpcbind.service nfs
在这里插入图片描述
node2节点挂在目录报错(第一次成功没有报错,之后再执行就报错):
挂载:
mount -t nfs 192.168.126.8:/usr/local/nfs /root/nfs
卸载
umount /root/nfs
开机自动挂载
写入/etc/fstab
mount -a

在这里插入图片描述
df -h 执行(node2节点)是已经挂载成功了
在这里插入图片描述
测试挂载:
客户端添加u.txt 文件夹,可以再服务端(node1)节点看到
在这里插入图片描述

如果添加的文件没有共享,需要设置共享目录权限。
在这里插入图片描述

yaml部署web项目

创建yaml文件

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: wework-tomcat-app1-deployment-label
  name: wework-tomcat-app1-deployment  --Deployment名称(由 .metadata.name 字段标明)
  namespace: wework    --所属namespace
spec:
  replicas: 3    --创建三个(由 replicas 字段标明)Pod 副本
  selector:
    matchLabels:
      app: wework-tomcat-app1-selector   --selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你选择在 Pod 模板中定义的标签(app: wework-tomcat-app1-selector), 在 API 版本 apps/v1 中,Deployment 标签选择算符在创建后是不可变的。
  template:
    metadata:
      labels:
        app: wework-tomcat-app1-selector  --Pod 被使用 labels 字段打上 app: nginx 标签。
    spec:
      containers:
      - name: wework-tomcat-app1-container
        image: jpress:v3
        ports:    	---容器内端口
        - containerPort: 8080
          protocol: TCP
          name: http
        volumeMounts:         ----容器内挂载点
        - name: wework-images     --必须有名字
          mountPath: /usr/local/tomcat
          readOnly: false
      volumes:
      - name: wework-images    ---跟上边名称一致
        nfs:        ---宿主机挂载点
          server: 192.168.126.8
          path: /usr/local/nfs
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: wework-tomcat-app1-service-label
  name: wework-tomcat-app1-service
  namespace: wework
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080
    nodePort: 30095
  selector:
    app: wework-app1-selector

编写完成后保存退出
应用该文件:kubectl apply -f wework.yaml
在这里插入图片描述
也可以查到对应的pod 和deployment
k8s添加pod,k8常用命令,k8s删除pod_第13张图片
会提示没有对应的catalina.sh
不知道为什么,pod刚运行起来没有在对应的共享目录中共享数据。
解决方法:将tomcat安装包解压后复制进共享目录,
k8s添加pod,k8常用命令,k8s删除pod_第14张图片
pod就可以正常运行了(以下是将副本数量设置为1了,好处理)
在这里插入图片描述
进入pod副本:kubectl exec -it podID /bin/bash
在这里插入图片描述
随意创建文件,可以在nfs服务端的共享目录看到
在这里插入图片描述
创建一个test.txt 文件测试,即使将pod删除后重新运行也依旧存在test.txt
在这里插入图片描述

实现镜像同步

注:
以下镜像名可以修改,如果修改为从阿里云pull的镜像(registry.cn-hangzhou.aliyuncs.com/mynamespacew/jpress:v3)
可以修改vi /etc/docker/daemon.json //如果没有此文件,请创建
添加代码
“insecure-registries”:[“htts://registry.cn-hangzhou.aliyuncs.com/mynamespacew”]
k8s添加pod,k8常用命令,k8s删除pod_第15张图片

pod状态为CrashLoopBackoff、ContainerCreating异常处理

新建pod,查看pod状态异常
查看pod日志:kubectl logs pod实例 -n 命名空间
在这里插入图片描述
kubectl describe pod pod实例名称 -n 命名空间
k8s添加pod,k8常用命令,k8s删除pod_第16张图片
进入pod和容器提示
在这里插入图片描述

pod状态为Imagepullbackoff异常处理

在这里插入图片描述
查看pod节点:kubectl describe pod jpresstest-9c7c97fbc-vpwnt
报错如下:back-off pulling image ‘jpress:v1’
在这里插入图片描述
经查,node节点没有该镜像
该pod所属node1节点,在该节点下pull该镜像
在这里插入图片描述
master节点重新获取pod正常
在这里插入图片描述
另外一个同理。

pod节点状态为terminating 状态异常处理步骤

查看节点状态是否正常:kubectl get nodes
k8s添加pod,k8常用命令,k8s删除pod_第17张图片
查看有问题的节点:kubectl get nodes node2

k8s添加pod,k8常用命令,k8s删除pod_第18张图片
kubelet stopped posting node status .说明是kubelet的问题。
确认node2节点的kubelet状态,状态正常
查看运行日志:Journalctl -u kubelet
在这里插入图片描述
重启kubelet后正常:systemctl restart kubelet
k8s添加pod,k8常用命令,k8s删除pod_第19张图片

删除pod

K8S 不能直接删除Pod,直接删除Pod,会被Deployment重启
先删除deployment.
1.查看deployment
在这里插入图片描述
查看pod
k8s添加pod,k8常用命令,k8s删除pod_第20张图片
2删除deployment:kubectl delete deployment nginx
查看deployment
k8s添加pod,k8常用命令,k8s删除pod_第21张图片
3删除服务
k8s添加pod,k8常用命令,k8s删除pod_第22张图片
kubectl delete src nginx
在这里插入图片描述
kubectl get src
在这里插入图片描述
4
状态为terminating的无法删除
k8s添加pod,k8常用命令,k8s删除pod_第23张图片
可以强制删除:kubectl delete pod pod-name -n ns-name --force --grace-period=0
k8s添加pod,k8常用命令,k8s删除pod_第24张图片
再查看就没有对应的pod了
注:
如果强制删除还不行,设置finalizers为空
(如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。)
kubectl patch pod xxx -n xxx -p ‘{“metadata”:{“finalizers”:null}}’

常用命令

1
查看节点的标签
kubectl describe ns test | grep “Labels” -A 10
2
查看服务器节点
kubectl get nodes
3
节点打标签
kubectl label nodes <节点名称> labelName=<标签名称>
例:kubectl label nodes node2 labelName=test
kubectl get node --show-labels
k8s添加pod,k8常用命令,k8s删除pod_第25张图片
4
删除节点标签
kubectl label node node2 labelName-
5
查看所有pod节点
kubectl get pod -A
6
查看对应节点的所属IP地址
kubectl get pod -o wide -n kube-system
查看所有节点的所属IP地址
kubectl get pod -o wide -A
7
根据yaml文件创建pod
kubectl apply -f yaml文件
根据yaml文件删除pod
kubectl delete -f yaml文件
8
创建命名空间test:
kubectl create ns test
为命名空间test设置标签ev=test:
kubectl label ns test env=test
修改命名空间标签
kubectl label --overwrite ns test env=testtest
删除命名空间标签
kubectl label ns test env-
9
扩容/缩容
kubectl scale deploy/ --replicas=<5>
k8s添加pod,k8常用命令,k8s删除pod_第26张图片
10
暂停deployment,被 pause 命令暂停的资源不会被控制器协调使用
kubectl rollout pause deployment deploy名称 -n 命名空间
启动deployment
kubectl rollout resume deployment deploy名称 -n 命名空间
11
进入pod和容器
kubectl exec -it 容器id -n 命名空间名称
12
查看历史更新:kubectl roullout history deploy/deployment -n 命名空间
k8s添加pod,k8常用命令,k8s删除pod_第27张图片
13
回退pod到上一个版本:kubectl roullout undo deploy/wework-deployment -n wework
回退pod到上一个版本也会记录在更新历史中。
k8s添加pod,k8常用命令,k8s删除pod_第28张图片

error converting YAML to JSON: yaml: line 3: mapping values are not allowed in this context
这个问题是因为yaml文件不支持tab制表符
yaml语法不支持制表符,用空格代替就行。

你可能感兴趣的:(kubernetes,运维)