当前位置: 首页 > article >正文

K8S---02.Kubernetes的pod

1 命名空间操作

命名空间的作用是为了 隔离资源 理解成对资源进行分类。

名称:namespace 简写:ns

默认命名空间为“default”

1.1 创建命名空间

kubectl  create ns 命名空间名称
 kubectl  create ns my-ns

1.2 查看命名空间

kubectl  get namespace  /  kubectl get ns

命名空间创建后无法更新!

1.3 删除命名空间

kubectl delete ns 命名空间名称

1.4 查看命名空间下的所有资源

kubectl get all -n  命名空间名称

注意:如果不创建命名空间也可以使用默认的命名空间

namespace 类似于java代码中的包 不设置包名就会直接存放到src下面

2 pod操作

什么是 Pod

摘取官网: Pod | Kubernetes

2.1 简介

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个)容器; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。简言之如果用 Docker 的术语来描述,Pod 类似于共享名字空间并共享文件系统卷的一组容器。

定义: Pod 就是用来管理一组(一个|多个)容器的集合 特点: 共享网络 共享存储 共享上下文环境

pod 英文里面是 “豆荚”的意思,pod是k8s中管理容器资源的最小单位,在k8s中你不能直接管理“容器”,容器必须放在pod中,一个pod中可以有多个容器。多个容器相当于 在一个“操作系统中。” 就是一个pod相当于有一个ip,在这个pod中容器的端口号 是不能重复的,pod中的容器 也都能通过 localhost:端口号访问到其他容器的内容。

名称:pod 简写:po

2.2 Pod 怎样管理多个容器?

Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。 容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 "边车 (sidercar)" 容器负责从远端更新这些文件,如下图所示:

2.3 如何使用 Pod?

通常你不需要直接创建 Pod,甚至单实例 Pod。 相反,你会使用诸如 Deployment 或 Job 这类工作负载资源来创建 Pod。 如果 Pod 需要跟踪状态,可以考虑 StatefulSet 资源。

Kubernetes 集群中的 Pod 主要有两种用法:

  • 运行单个容器的 Pod。"每个 Pod 一个容器" 模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。

  • 运行多个协同工作的容器 的 Pod。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。 这些位于同一位置的容器可能形成单个内聚的服务单元 —— 一个容器将文件从共享卷提供给公众, 而另一个单独的 “边车”(sidecar)容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。

说明:

  • 将多个并置、同管的容器组织到一个 Pod 中是一种相对高级的使用场景。 只有在一些场景中,容器之间紧密关联时你才应该使用这种模式。

  • 每个 Pod 都旨在运行给定应用程序的单个实例。如果希望横向扩展应用程序 (例如,运行多个实例以提供更多的资源),则应该使用多个 Pod,每个实例使用一个 Pod。 在 Kubernetes 中,这通常被称为副本(Replication)。 通常使用一种工作负载资源及其控制器来创建和管理一组 Pod 副本。

2.4 Pod 基本操作

2.4.1 查看 pod
# 查看默认命名空间的 pod
kubectl get pods|pod|po
​
# 查看所有命名空间的 pod
kubectl get pods|pod -A
kubectl get pods|pod|po -n 命名空间名称
​
# 查看默认命名空间下 pod 的详细信息
kubectl get pods -o wide 
​
# 查看所有命名空间下 pod 的详细信息
kubectl get pods -o wide -A
​
# 实时监控 pod 的状态
​
kubectl get pod -w
2.4.2 创建 pod
1. 命令创建

pod : kubectl run my-pod-ns2 --image=nginx:1.19 --restart=Never -n=my-ns

-- my-pod 指的是pod的名字

--image 指定拉取容器的镜像名称

--restart 指定pod的重启策略

-n指定创建好的pod放在哪个命名空间 如果不写就会存放到默认的命名空间中

如果STATUS一直未到Running运行状态,可以使用describe子命令查看Pod的描述信息:

kubectl describe pod名称

注意,如果要查看的pod 如果不在默认default命名空间,需要加上-n 命名空间参数

 kubectl describe pod  my-pod-ns2  -n=my-ns

2. yaml 方式创建

官网参考地址: Pod | Kubernetes/

# nginx-pod.yml
# 代表使用的 api 版本
apiVersion: v1
# 代表创建类型
kind: Pod
# 用来书写对应元数据信息 指定pod名称以及namespace
metadata:
# pod 的名字
  name: nginx-yaml
# 对pod 预期行为的规约
spec:
  # 容器
  containers:
   # 容器的名字
    - name: mynginx
      image: nginx:1.19
      ports:
       - containerPort: 80
         protocol: TCP
​
# 使用 kubectl apply/create -f 创建 pod
kubectl create -f nginx-pod.yml
kubectl apply -f nginx-pod.yml
注意: create 仅仅是不存在时创建,如果已经存在则报错!apply 不存在创建,存在更新配置。推荐使用 apply!

2.3 删除 pod
kubectl delete pod  pod名称
​
kubectl delete -f pod.yml
2.4 进入 pod 中容器
# 注意: 这种方式进入容器默认只会进入 pod 中第一个容器
​
 kubectl exec -it nginx(pod名称) --(固定写死) bash(执行命令)
​
# 注意: 进入指定 pod 中指定容器
​
kubectl exec -it pod名称 -c 容器名称 --(固定写死) bash(执行命令)
2.5 查看 pod 日志
# 注意: 查看 pod 中第一个容器日志
​
kubectl logs -f(可选,实时) nginx(pod 名称)
​
# 注意: 查看 pod 中指定容器的日志
​
kubect logs -f pod名称 -c 容器名称
2.6 查看 pod 描述信息
 kubectl describe pod nginx(pod名称)
kubectl describe pod nginx-yaml

3 Pod 运行多个容器

3.1 创建 pod
# myapp-pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
​
    - name: nginx
      image: nginx:1.19
      ports:
            - containerPort: 80
      imagePullPolicy: IfNotPresent
    - name: redis
      image: redis:5.0.10
      ports:
            - containerPort: 6379
      imagePullPolicy: IfNotPresent
​
 kubectl apply -f myapp-pod.yml
3.2 查看指定容器日志
# 查看日志 (默认只查看第一个容器日志,这里是展示 nginx 日志)
​
kubectl logs -f myapp
​
​
​
# 查看 pod 中指定容器的日志
​
kubectl logs -f myapp -c nginx(容器名称)
​
kubectl logs -f myapp -c redis(容器名称)
3.3 进入容器
# 进入 pod 的容器 (默认进入第一个容器内部,这里会进入 nginx 容器内部)
​
 kubectl exec -it myapp -- sh
​
​
​
# 进入 pod 中指定容器内部
​
kubectl exec -it myapp -c nginx -- sh
​
kubectl exec -it myapp -c redis -- sh

4. Pod 的 Labels(标签)

标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性。标签可以在创建时附加到对象,随后可以随时添加和修改。每个对象都可以定义一组键(key)/值(value)标签,但是每个键(key)对于给定对象必须是唯一的。

标签作用: 就是用来给 k8s 中对象起别名, 有了别名可以过滤和筛选

4.1 语法

标签由键值对组成,其有效标签值:

  • 必须为 63 个字符或更少(可以为空)

  • 除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾

  • 包含破折号(-)、下划线(_)、点(.)和字母或数字

4.2 示例
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp #创建时添加
spec:
  containers:
    - name: nginx
      image: nginx:1.21
      imagePullPolicy: IfNotPresent
    - name: redis
      image: redis:5.0.10
      imagePullPolicy: IfNotPresent
  restartPolicy: Always
4.3 标签基本操作
# 查看标签
​
 kubectl get pods --show-labels
​
​
​
# kubectl label pod pod名称 标签键值对
​
kubectl label pod myapp env=prod
​
​
​
# 覆盖标签 --overwrite
​
 kubectl label --overwrite pod myapp env=test
​
​
​
# 删除标签 -号代表删除标签
​
kubectl label pod myapp env-
​
​
​
# 根据标签筛选 env=test/env  > = < 
​
kubectl get po -l env=test
​
kubectl get po -l env
​
kubectl get po -l '!env' # 不包含的 pod
​
kubectl get po -l 'env in (test,prod)' #选择含有指定值的 pod
​
kubectl get po -l 'env notin (test,prod)' #选择含有指定值的 pod
4.4 部署项目到pod
1. 编译好的项目

将书写完毕的springboot项目打成jar包上传到虚拟机中

2. 项目需要的环境

 在docker里面拉去jdk8

 

3. 准备dockerfile文件

FROM openjdk:8
VOLUME /tmp
# jar 包添加到容器
ADD boot.jar /test.jar
EXPOSE 8999
#
RUN bash -c 'touch /test.jar'
# 命令
ENTRYPOINT ["java","-jar","/test.jar","&","daemon off;"]
4. 将项目上传到docker镜像

 

5. sql存放

在opt目录下创建一个文件夹 用来存放上传的springboot项目所需要的sql

 

在两个从机里面也创建文件夹 下面从主机将sql传到两个从机内 

 

将sql文件传入从机 

 scp -r /opt/mysqldata/test.sql root@192.168.5.97:/opt/mysqldata/

 

6. 将当前主机上部署的项目镜像打包传给两个从机 

#打包镜像

docker save -o mypro.tar mypro:latest

 

#将镜像传给两个从机  放到任意目录下都行 这里我放到了 / 下面

scp -r /aaa/k8s/pro/mypro.tar root@192.168.5.97:/

 

7. 关闭主机的mysql

查看三台主机的mysql和redis是否开启 如果开启关闭掉

 

8. 在两个从机里面加载传过去的镜像

docker load -i mypro.tar 

9. 创建mypro.yaml文件

mypro.yaml配置文件内容如下

#使用api的版本 一般为v1
apiVersion: v1
#资源类型 其他还有Namespace,Deployment,Service等等
kind: Pod
#元数据
metadata:
  #pod 名称
  name: pod-project
#pod 规范
spec:
  #pod中放置的容器
  containers:
    #容器镜像
    - image: mypro:latest
      imagePullPolicy: Never  # 不从远程拉取镜像
      #容器名称
      name: my-pro
      #容器端口号
      ports:
        #当前端口号名称
        - containerPort: 8999
          #协议类型
          protocol: TCP
        #配置环境变量
      env:
        - name: SPRING_REDIS_HOST
          value: redis
        - name: SPRING_DATASOURCE_URL
          value: jdbc:mysql://localhost:3306/test
    - image: mysql:5.7
      name: mysql57
      ports:
        - containerPort: 3306
          #协议类型
          protocol: TCP
      env:
        #定义mysql数据库的root用户的密码
        - name: MYSQL_ROOT_PASSWORD
          value: root
        #自动创建指定名称的数据库
        - name: MYSQL_DATABASE
          value: test
        #指定使用容器数据卷,容器数据卷需要在下面声明
      volumeMounts:
        #使用的容器数据卷名称 需要定义
        - name: myvolume
          #容器内路径
          mountPath: /docker-entrypoint-initdb.d
    - image: redis:latest
      name: redis
      ports:
        - containerPort: 6379
          #协议类型
          protocol: TCP
        #指定使用容器数据卷,容器数据卷需要在下面声明
      volumeMounts:
        #使用的容器数据卷名称 需要定义
        - name: myredisvolume
          #容器内路径
          mountPath: /usr/local/etc/redis/redis.conf

  volumes:
    - name: myvolume
      hostPath:
        #主机路径
        path: /opt/mysqldata
        #表示主机类型为目录并且如果没有这个目录就创建这个目录 另外可选值Directory File FileOrCreate
        type: DirectoryOrCreate
    - name: myredisvolume
      hostPath:
        #主机路径
        path: /opt/mypro/redis.conf
        #表示主机类型为目录并且如果没有这个目录就创建这个目录 另外可选值Directory File FileOrCreate
        type: DirectoryOrCreate

 

10. 创建pod

执行上方创建的配置文件

kubectl apply -f mypro.yaml

 

查看pod

kubectl get pods -o wide 

 

11. 校验部署是否成功

 


http://www.kler.cn/news/360069.html

相关文章:

  • python支付宝支付和回调
  • 计算机毕业设计Python深度学习房价预测 房源可视化 房源爬虫 二手房可视化 二手房爬虫 递归决策树模型 机器学习 深度学习 大数据毕业设计
  • 【Vue.js设计与实现】第三篇第10章:渲染器-双端 Diff 算法-阅读笔记
  • 如何使用postman进行自动化
  • Milvus 到 TiDB 向量迁移实践
  • 关于游戏行业工作的迷茫
  • Sqlite3 操作笔记
  • Java设计模式:工厂模式详解
  • ERC论文阅读(01)--BiosERC论文阅读笔记
  • 数据结构(8.3_2)——快速排序
  • 校园周边美食探索及分享平台的设计与实现(论文+源码)_kaic
  • 数控机械制造工厂ERP适用范围有哪些
  • STM32-Modbus协议(一文通)
  • ​通过‌组策略编辑器关闭​
  • 计算机毕业设计 基于 Python的考研学习系统的设计与实现 Python毕业设计选题 前后端分离 附源码 讲解 文档
  • Python基础和理论学习
  • IP池与代理池的区别
  • 三品PLM系统解决方案赋能航空制造企业 研发管理升级赢得市场主动
  • 配置nginx服务通过ip访问多网站
  • CISP/NISP二级练习题-第一卷