kubernetes 集群命令行工具 kubectl
1、kubectl 概述
kubectl 是 Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
2、kubectl 命令的语法
(1)comand:指定要对资源执行的操作,例如 create、get、describe 和 delete
(2)TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的 形式。例如:
(3)NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源, 例如:
(2)flags:指定可选的参数。例如,可用-s 或者–server 参数指定 Kubernetes API
server 的地址和端口。
3、kubectl help 获取更多信息
4、kubectl 子命令使用分类
(1)基础命令
(2)部署和集群管理命令
(3)故障和调试命令
(4)其他命令
kubernetes 集群 YAML 文件详解
1、YAML 文件概述
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
2、YAML 文件书写格式
(1)YAML 介绍
YAML :仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。
YAML 是一个可读性高,用来表达数据序列的格式。
(2)YAML 基本语法
使用空格做为缩进
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
低版本缩进时不允许使用 Tab 键,只允许使用空格
使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
总结:
查看API版本
3、快速生成yaml
- 第一种 使用kubectl create 命令生成yaml文件
- 第二种 使用kubectl get命令导出yaml文件
案例:
针对没有部署的生成yaml
kubectl create deployment web --image=nginx -o yaml --dry-run
kubectl create deployment web --image=nginx -o yaml --dry-run > demo1.yaml
针对已经部署的生成yaml
kubectl get deploy
kubectl get deploy web -o yaml > my-deploy.yml
新版本的—export已经删除
kubernetes 核心技术-Pod
1、Pod 概述
Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod 提供存储等等,k8s 不会直接处理容器,而是 Pod,Pod 是由一个或多个 container 组成
Pod 是 Kubernetes 的最重要概念,每一个 Pod 都有一个特殊的被称为”根容器“的 Pause 容器。Pause 容器对应的镜 像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容器。
Pod 特性
(1)资源共享
一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如
namespace,cgroups 或者其他的隔离资源。
多个容器共享同一 networknamespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之间通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod 的 IP 进行通信。
一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上。
(2)拉取策略
(3)pod资源的限制
(4)pod重启机制
(5)健康检查
pod流程
节点的选择器
节点的亲和性
污点和污点容忍
案例:
查看污点
kubectl describe node s201 | grep Taint
删除所有的pod
kubectl delete deployment nginx
#污点
kubectl taint node s202 env_role=yes:NoSchedule
创建pod
kubectl create deployment web --image=nginx
kubectl get pods -o wide
扩展pod
kubectl scale deployment web --replicas=5
kubectl get pods -o wide
删除污点
kubectl taint node s202 env_role=yes:NoSchedule-
kubectl describe node s202 | grep Taint
K8S核心组件之Controller
1、什么是controller
2、Pod和Controller关系
3、Deployment控制器应用场景
4、yaml文件字段说明
5、Deployment控制器部署应用
6、升级回滚
7、弹性伸缩
什么是controller
- 在集群上管理和运行容器的对象
Pod和Controller的关系
Pod是通过Controller实现应用的运维比如伸缩,滚动升级等等。
pod和controller之间是通过label标签建立关系。Deployment控制器应用场景
部署无状态应用
管理Pod和ReplicaSet
部署,滚动升级等功能
应用场景:web服务,微服务yaml文件字段说明
```yaml [root@s201 ~]# cat web.yml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 1 selector: matchLabels: app: web strategy: {} template: metadata: creationTimestamp: null labels: app: web spec: containers:# 如果删除不了强制删除 kubectl delete pod xxxx --grace-period=0 --force kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
- image: nginx name: nginx resources: {} status: {}

<a name="XTQfb"></a>
## Deployment控制器部署应用
```yaml
kubectl apply -f web.yaml
kubectl get pods
#对外暴露端口
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --dry-run --name=web1 -o yaml> web1.yaml
kubectl apply -f web1.yaml
kubectl get pods,svc
# 删除svc
kubectl delete service/web1
应用的升级回滚和弹性伸缩
前提是nginx 定义1.14版本,为2个副本
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx:1.14
name: nginx
resources: {}
status: {}
kubectl apply -f web.yaml
crictl images
# 升级
kubectl set image deployment web nginx=nginx:1.15
crictl images
# 查看是否升级成功
kubectl rollout status deployment web
# 回滚
#1、查看升级的版本
kubectl rollout history deployment web
#2、还原操作
kubectl rollout undo deployment web # 还原上一个版本
kubectl rollout undo deployment web --to-revision=2 # 指定版本
#3、伸缩版本
kubectl scale deployment web --replicas=10
#4、删除deployment
kubectl delete deployment web
运行yaml
kubectl apply -f web.yaml
kubectl get pod
crictl images
升级
kubectl set image deployment web nginx=nginx:1.15
升级的原理先更新新的 启动之后才会删除老的。
查看是否升级成功
kubectl rollout status deployment web
查看历史记录
kubectl rollout history deployment web
还原操作(指定上一个版本)
还原操作(指定版本)
kubectl rollout undo deployment web —to-revision=2
伸缩
kubectl scale deployment web —replicas=10
service
Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地 址,并且将请求负载分发到后端的各个容器应用上。
实战:
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --dry-run --name=web1 -o yaml> service.yaml
StatefulSet 的使用
使用statefulset的场景通常有以下特点:
- 有状态服务。
- 集群(多节点)部署。
- 节点有主从(备)之分。 集群通常是主节点先运行,从节点后续运行并加入集群,这里就用statefulset资源的有序部署的特性。
- 节点之间数据分片存储,这里使用到了statefulSet资源的存储隔离的特性,以及保证pod重新调度后还是能访问到相同的持久化数据。
kubectl api-resources |grep statefulsets
sts.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset
namespace: default
spec:
serviceName: nginx
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
验证网络
kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
删除pod
kubectl delete statefulset --all
kubectl delete svc nginx
kubectl delete svc web
DaemonSet
DaemonSet确保集群中每个(部分)node运行一份pod副本,当node加入集群时创建pod,当node离开集群时回收pod。如果删除DaemonSet,其创建的所有pod也被删除,DaemonSet中的pod覆盖整个集群。
当需要在集群内每个node运行同一个pod,使用DaemonSet是有价值的,以下是典型使用场景:
运行集群存储守护进程,如glusterd、ceph。
运行集群日志收集守护进程,如fluentd、logstash。
运行节点监控守护进程,如Prometheus Node Exporter, collectd, Datadog agent, New Relic agent, or Ganglia gmond。
日志收集
案例:vi ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx:1.14
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log
volumes:
- name: varlog
hostPath:
path: /var/log
进入容器执行:
kubectl exec -it pod名称 bash
一次性任务和定时任务
job
apiVersion: batch/v1
kind: Job
metadata:
name: job-example
spec:
template:
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never
crictl pull alpine
kubectl create -f job.yaml
删除jobs
kubectl delete -f job.yaml
定时任务
cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
kubectl apply -f cronjob.yaml
kubectl get cronjobs
kubectl delete -f cronjob.yaml
kubectl delete pod 名称 --grace-period=0 --force