Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望你用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:
$ kubectl create -f 我的配置文件
Yaml文件示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
[root@k8s ~]# kubectl apply -f nginx-deployment.yaml --namespace=kube-system
deployment.apps/nginx-deployment created
[root@k8s ~]# kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-54f57cf6bf-jpgq4 0/1 Pending 0 86m
nginx-deployment-54f57cf6bf-rrmbq 0/1 Pending 0 86m
或者
[root@k8s ~]# kubectl get pods -n kube-system
解决 pending 状态:
检查:
[root@k8s ~]# kubectl -n kube-system describe pod nginx-deployment-54f57cf6bf-rg8td
……
……
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 5s (x17 over 22m) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
查看节点的 Taints(kubectl describe node <node_name>)
Taints: node-role.kubernetes.io/master:NoSchedule
解决方案:
kubectl taint nodes --all node-role.kubernetes.io/master-
在“node-role.kubernetes.io/master”这个键后面加上了一个短横线“-”,这个格式就意味着移除所有以“node-role.kubernetes.io/master”为键的 Taint。
[root@k8s ~]# kubectl taint nodes --all node-role.kubernetes.io/master-
node/instance-010oj085 untainted
再次查看状态(在命令行中,所有 key-value 格式的参数,都使用“=”而非“:”表示)
[root@k8s ~]# kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-54f57cf6bf-jpgq4 1/1 Running 0 148m
nginx-deployment-54f57cf6bf-rrmbq 1/1 Running 0 148m
查看 describe 的 Event 事件:
……
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 10m (x39 over 65m) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
Normal Pulling 5m41s kubelet, instance-010oj085 Pulling image "nginx:1.7.9"
Normal Pulled 4m37s kubelet, instance-010oj085 Successfully pulled image "nginx:1.7.9"
Normal Created 4m37s kubelet, instance-010oj085 Created container nginx
Normal Started 4m37s kubelet, instance-010oj085 Started container nginx
1. 修改 YAML 文件
2. 执行命令
# 修改nginx-deployment.yaml的内容
kubectl apply -f nginx-deployment.yaml
当应用本身发生变化时,开发人员和运维人员可以依靠容器镜像来进行同步;当应用部署参数发生变化时,这些 YAML 文件就是他们相互沟通和信任的媒介。
$ kubectl delete -f nginx-deployment.yaml