自建 Kubernetes 上运行容器

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

像这样的一个 YAML 文件,对应到 Kubernetes 中,就是一个 API Object(API 对象)。当你为这个对象的各个字段填好值并提交给 Kubernetes 之后,Kubernetes 就会负责创建出这些对象所定义的容器或者其他类型的 API 资源。

这个 YAML 文件中的 Kind 字段,指定了这个 API 对象的类型(Type),是一个 Deployment。Deployment,是一个定义多副本应用(即多个副本 Pod)的对象

这个 YAML 文件中,定义的 Pod 副本个数 (spec.replicas) 是:2。

Pod 模版(spec.template),这个模版描述了创建的 Pod 的细节。在上面的例子这个 Pod 里只有一个容器,这个容器的镜像(spec.containers.image)是 nginx:1.7.9,这个容器监听端口(containerPort)是 80。

这样使用一种 API 对象(Deployment)管理另一种 API 对象(Pod)的方法,在 Kubernetes 中,叫作“控制器”模式(controller pattern)

一个 Kubernetes 的 API 对象的定义,大多可以分为 Metadata 和 Spec 两个部分。前者存放的是这个对象的元数据,对所有 API 对象来说,这一部分的字段和格式基本上是一样的;而后者存放的,则是属于这个对象独有的定义,用来描述它所要表达的功能。

[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

解决方案:

在 Pod 的.yaml 文件中的 spec 部分,加入 tolerations 字段即可

或者 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f1ab90408fd21cd7fc8ee4fab4d95a5b.html