#云原生征文#Kubernetes基础知识 原创
@[TOC]
Kubernetes基础知识
kubernetes整体分为控制平面组件和节点组件
节点组件有kubelet,kube-proxy和容器运行时
容器运行时指的是负责运行容器的软件比如docker,kube-proxy负责网络代理,kubelet用来管理Kubernetes创建的容器,保证容器运行状态良好
控制平面节点有API Server,这个是访问的入口,调度器主要负责调度pod运行到工作节点中,控制器负责管理集群状态,etcd是存储服务,保存集群数据,而pod就是一个虚拟主机或者物理主机,里面运行着各种容器,通过共享存储卷实现容器间的数据共享,当pod出现错误的时候通过控制器来管理pod
Kubernetes至少有一个主控节点和三个工作节点,主控节点中有控制平面的组件,工作节点中有节点组件
Kubernetes提供了各种各样的控制器来管理这些pod,下面介绍一下Kubernetes的控制器
ConfigMap 配置表
这里定义name为app-config的ConfigMap,以key-value的形式存储
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application.properties:
server.port = 9090
spring.application.name = myapp
这个ConfigMap配置的是服务的端口号和服务名,名为app-config,我们看一下怎么使用这个配置表
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
labels:
app: demo-app
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: app
image: localhost:5000/demo-app
env:
- name: SPRING_CONFIG_LOCATION
value: /etc/config/
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
这里的Deployment定义中configMap指定app-config,这个文件存储在了/etc/config中
控制器
ReplicationController
ReplicationController保证一定数量的pod正常运行,当比指定pod数量少的时候就添加pod,当多于pod数量的时候就删除节点
ReplicaSet副本集
ReplicaSet相当于ReplicationController的升级版,副本集模式也是创建指定数量的副本,它和ReplicationController的区别在于它的支持基于集合的标签选择算符,配置文件如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
配置文件中replicas变量指定的就是副本数量,spec:containers:中指定pod节点,但是一般我们不使用ReplicaSet因为它没有更新的功能,使用Deployment来替代和管理ReplicaSet
创建ReplicaSet命令
kubectl apply -f ReplicaSet.yaml
查看创建的pod
kubectl get pods
所有控制器的yaml文件的运行都是这样的
Deployment部署
Deployment最大的特点就是可以对副本集的pod进行滚动更新,滚动更新能够保证服务的不中断,当创建一定数量后再删除旧的pod节点,这也是生产中经常使用的pod控制器,代码如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
和ReplicaSet副本集控制器的区别就是kind不同,其他都是相同的
StatefulSet有状态集
有状态集就是确定每一个pod的创建顺序,创建副本的时候会根据标识符来对pdi进行命名:
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
spec:
replicas: 3
selector:
matchLabels:
app: nginx
serviceName: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17
ports:
- containerPort: 80
name: web
通过metadata:name: 来指定创建的pod名称分别的Nginx-0、Nginx-1、Nginx-2,在扩缩容方面,删除pod节点的时候是按照创建节点的倒序进行删除的
DaemonSet守护程序集
DaemonSet顾名思义就是守护的程序集,和守护线程差不多,它会为节点创建一个pod,包括节点加入集群中,删除节点的时候,创建的pod也会删除,和守护线程一样同生共死
Job一次性的任务
Job是设置一次性的任务,job在pod的生命周期中只适合restartPolicy重启策略为OnFailure和Never,对于Job我们还可以设置任务完成或失败后存活时间,通过参数.spec.ttlSecondsAfterFinished来设置
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
ttlSecondsAfterFinished: 100
template:
spec:
containers:
- name: myjob
image: busybox
command: ["echo", "hello k8s job"]
restartPolicy: Never
这就是这个pod运行成功结束后100s后被删掉
CronJob定时任务
CronJob就是利用定时任务表达式来设置定时执行某个pod
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello Kubernetes
restartPolicy: OnFailure
每隔一分钟输出一次时间和输出Hello Kubernetes信息
总结
这篇主要主要讲了Kubernetes的相关知识点和各种组件,主要内容是控制器的定义和特点,我们生产中经常用的控制器的Deployment,它支持滚动更新。
【本文正在参加云原生有奖征文活动】,活动链接:https://ost.51cto.com/posts/12598