基础环境
操作系统:CentOS Linux release 7.4.1708 (GUI)
docker版本: 17.03.2-ce
socat版本:1.7.3.2-2.el7.x86_64
kubelet版本: 1.9.9-9.x86_64
kubernetes-cni版本: 0.6.0-0.x86_64
kubectl版本: 1.9.0-0.x86_64
kubeadm版本: 1.9.0-0.x86_64
集群信息
node1.domain Ready master 24d v1.9.0
node2.domain Ready < none> 24d v1.9.0
node3.domain Ready < none> 24d v1.9.0
Deployment部署的副本pod分布在各个Node上,每个Node可运行几个副本。
# kubectl run nginx-deployment –image=nginx:1.7.9 –replicas=2
增加一个副本:
# kubectl scale deployments/nginx-deployment –replicas=3
查看nginx-deployment状态:
# kubectl get deployment nginx-deployment
可以查看副本状态:
可以查看pod状态:
# kubectl get pod
可以查看pod详细信息:
# kubectl describe pod podname
也可以通过配置文件的方式运行:
创建一个名为nginx.yml的文件,包含如下内容(缩进严格控制):
apiVersion: extensions/v1beta1 #当前配置格式版本
kind: Deployment #创建资源类型
metadata: #资源元数据,name是必须项
name: nginx-deployment
spec: #资源规格说明
replicas: 3 #副本数量
template: #定义pod模板
metadata: #pod元数据,至少一个label
labels:
app: web_server
spec: #pod规格说明
containers:
- name: nginx
image: nginx:1.7.9
用配置文件创建应用:
# kubectl apply -f nginx.yml
Deployment
nginx-deployment配置文件初始是三个副本,修改replicas为5个,再次执行kubectl apply
让master运行pod:
# kubectl taint node k8s-master node-role.kubernetes.io/master-
master only
# kubectl taint node k8s-master node-role.kubernetes.io/master=”“:NoSchedule
默认情况,scheduler会将pod调度至所有可用节点,可指定pod至特定node
配置节点label:
# kubectl label node node2.domain disktype=ssd
查看节点label
# kubectl get node –show-labels
编辑配置文件nginx.yml,增加nodeSelector配置项后执行kubectl apply:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 5
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
nodeSelector:
disktype: ssd
删除节点 label
# kubectl label node node2.domain disktype-
DaemonSet部署的副本pod可分布在各个Node上,每个Node最多只能运行一个副本。
直接在docker中运行NodeExporter容器:
# docker run -d -v “/proc:/host/proc” -v “/sys:/host/sys” -v “/:/rootfs” –net=host prom/node-exporter –path.procfs /host/proc –path.sysfs /host/sys –collector.filesystem.ignored-mount-points “\^/(sys|proc|dev|host|etc)($|/)”
通过YAML配置文件的方式运行pod,创建一个名为node_exporte.yml的文件,包含如下内容(缩进严格控制):
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter-daemonset
spec:
template:
metadata:
labels:
app: prometheus
spec:
hostNetwork: true #直接使用Host网络
containers:
- name: node-exporter
image: prom/node-exporter
imagePullPolicy: IfNotPresent
command: #设置容器启动命令
- /bin/node_exporter
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- ^/(sys|proc|dev|host|etc)($|/)
volumeMounts: #映射Host路径至容器
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: root
mountPath: /rootfs
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /
执行kubectl apply,查看pod 状态:
容器按照持续时间可以分为两类:服务类容器和工作类容器。
服务类容器通常持续提供服务,工作类容器则是一次性任务,完成后容器就退出。
创建一个名为myjob.yml的文件,包含如下内容(缩进严格控制):
apiVersion: batch/v1 #Job的apiVersion
kind: Job #资源类型
metadata:
name: myjob
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hello k8s job!"]
restartPolicy: Never #指定重启方式(对于job只能设置为Never或者OnFailure)
执行kubectl apply
通过kubectl get job 查看job状态:
通过kubectl get pod –show-all 查看,因为pod执行完毕后已经退出
通过kubectl logs 查看pod标准输出:
Pod失败的情况,创建一个名为myjobF.yml的文件,包含如下内容(缩进严格控制):
apiVersion: batch/v1
kind: Job
metadata:
name: myjobf
spec:
template:
metadata:
name: myjobf
spec:
containers:
- name: hellof
image: busybox
command: ["invalid command","hello k8s job!"]
restartPolicy: Never
执行kubectl apply,查看job状态:
查看pod状态:
多个pod处于非正常状态,通过kubectl describe pod查看某个pod日志:
删除pod:
# kubectl delete -f myjobF.yml
修改myjobF.yml配置,将restartPolicy: Never修改为restartPolicy:OnFailure,执行kubectl apply
查看pod状态:
同时运行两个pod:
修改myjob.yml配置,添加配置parallelism: 2,执行kubectl apply
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
parallelism: 2
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hello k8s job!"]
restartPolicy: OnFialure
每次运行两个pod,直到6个pod成功完成:
修改myjob.yml配置,添加配置completion: 6,执行kubectl apply
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 6
parallelism: 2
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hello k8s job!"]
restartPolicy: OnFailure
修改配置文件 /etc/kubernetes/manifests/kube-apiserver.yaml,添加一行:
- –runtime-config=batch/v2alpha1=true
重启kubectl.service
通过kubectl api-versions查看:
创建CronJob
创建一个名为cronjob.yml的文件,包含如下内容(缩进严格控制):
apiVersion: batch/v2alpha1 #当前CronJob的apiVersion
kind: CronJob #指定资源类型
metadata:
name: cronjob
spec:
schedule: "*/1 * * * *" #定时crond,格式Linux一致
jobTemplate: #Job模板,与普通Job一致
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hello k8s job!"]
restartPolicy: OnFailure
执行kubectl apply,通过kubectl get cronjob查看状态,kubectl get
jobs查看job执行情况:
通过kubectl get pods –show-all 查看job:
通过kubectl logs pod 查看执行结果: