k8s学习笔记
笔记大部分从官方地址中总结的,可以参考官方地址学习。
k8s官方文档地址:https://kubernetes.io/zh-cn/docs/
定义
k8s中,所有内容都被抽象成资源,用户通过操作资源来管理k8s。
k8s资源大致分为以下几种。pod、namespace、label、Deployment、Service,接下来分别介绍各个资源
1、pod
pod是k8s中的最小运行单元,可以理解为容器的封装。一个pod可以包含一个或多个容器。
kubectl命令参考:
以下命名空间统一用kube-system代替
powershell
# 获取指定Namespace下的pod
kubectl get pods -n kube-system
# 获取pod所在节点的信息
kubectl get pods -n kube-system -o wide
# 获取某个pod详细信息
kubectl describe pods podName -n kube-system
# 动态查看pod信息
kubectl get pods podName -n kube-system -w
2、Deployment
在k8s中,一般不直接操作pod进行管理,而是操作pod控制器进行管理pod,从而实现容器的管理。Deployment只是其中的一种控制器类型。
命令:
bash
# 查看deployment下的pod信息
kubectl get deploy -n kube-system
# 查看详细信息
kubectl describe deploy podName -n kube-system
# 删除
kubectl delete deploy podName -n kube-system
3、Label
Label是给各个资源贴上标签,通过标签可以对各个资源进行一个划分和选择。
命令:
bash
# 查看标签
kubectl get pod podName -n kube-system --show-labels
4、Service
各个pod之间都有一个虚拟ip、而且每次重启k8s服务都会重新分配pod的虚拟ip、并且外部是不可访问pod的虚拟ip的。基于此问题,Service应运而生,Service是可以看作是一组同类Pod对外访问的接口,借助Service,应用可以方便地实现服务发现和负载均衡。
命令:
bash
# 查看service
kubectl get svc -n kube-system -o wide
5、Namespace
默认情况下,k8s中的pod之间是可以互相访问的,这样会导致许多问题。Namespace是可以实现资源隔离的作用,同Namespace的pod之间可以访问,不同Namespace的pod不可以访问。
命令:
bash
# 获取所有命名空间
kubectl get ns
# 创建命名空间 dev
kubectl create ns dev
# 删除命名空间dev
kubectl delete ns dev
kubectl工具
定义:
kubectl可以理解为扩展版的docker-compose,与docker-compose一样,都支持通过yml文件进行容器的创建,更新,删除。区别就是kubectl是为k8s集群中的容器进行操作的。还有二者的yml语法不同
yml语法:
yaml
apiVersion: apps/v1 # 必选,版本号
kind: Deployment # 资源类型Pod、Deployment
metadata: # 元数据
name: portal-back-deployment # pod名称
namespace: kube-system # pod所属的Namespace
spec: # pod容器中的详细定义
replicas: 1 # 备份数量
selector: # 管理的 Pod 的标签选择器
matchLabels: # 指定了标签选择器匹配的标签
app: test # 标签为app=portalback
template: # 指定创建pod的模板
metadata: # pod元数据信息
labels: # 指定了 Pod 的标签
app: test # 同上述matchLabels值一致
spec: # pod规格信息
containers: # 容器列表
- name: portal-back-container # 容器名称
image: 192.168.22.191:30002/kubecube/portal_back:V2.0 # 容器镜像名
stdin: true # 指定了是否将标准输入传递给容器
tty: true # 是否创建伪终端供容器使用
securityContext: # 指定了容器的安全上下文配置
privileged: true # 指定了容器是否具有特权
volumeMounts: # 挂载到容器内部的存储设置
- name: k8s-config # 挂载名称
mountPath: /root # 挂载到容器内部的目录
volumes:
- name: k8s-config
hostPath: # 主机存储位置,
path: /root/.kube # 主机存储目录
type: Directory # 挂载类型为目录
hostPID: true # 指定了是否在 Pod 中使用宿主机的 PID命名空间
hostIPC: true # 指定了是否在 Pod 中使用宿主机的 PID命名空间
---
apiVersion: v1
kind: Service # 资源类型为Service
metadata: # 元数据
name: portal-back-port # 资源名称
namespace: kube-system # 应用的Namespace
spec: # 规格数据
selector: # 选择器
app: test # 标签为app=test
type: NodePort # service类型,NodePort表示暴露节点上的端口
ports: # 指定了 Service 所监听的端口配置
- name: port1 # 指定了端口的名称为port1
protocol: TCP # 端口协议类型为tcp
port: 7124 # service监听端口号
targetPort: 7124 # pod端口号
nodePort: 30894 # 暴露的节点端口号
shell
# 使用声明式对象管理pod
# 部署应用pod容器
kubectl apply -f test.yml
# 删除pod容器
kubectl delete -f test.yml
-
命令式对象管理:直接使用命令去操作kubernetes资源
powershellkubectl run nginx-pod --image=nginx:1.17.1 --port=80
-
命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
powershellkubectl create/patch -f nginx-pod.yaml
-
声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
powershellkubectl apply -f nginx-pod.yaml
类型 | 操作对象 | 适用环境 | 优点 | 缺点 |
---|---|---|---|---|
命令式对象管理 | 对象 | 测试 | 简单 | 只能操作活动对象,无法审计、跟踪 |
命令式对象配置 | 文件 | 开发 | 可以审计、跟踪 | 项目大时,配置文件多,操作麻烦 |
声明式对象配置 | 目录 | 开发 | 支持目录操作 | 意外情况下难以调试 |