kubernetes中创建一个容器化应用

扮演一个应用开发者的角色,使用这个 Kubernetes 集群发布第一个容器化应用。

  1. 作为一个应用开发者,你首先要做的,是制作容器的镜像。
  2. 有了容器镜像之后,需要按照 Kubernetes 项目的规范和要求,将你的镜像组织为它能够"认识"的方式,然后提交上去。

什么才是 Kubernetes 项目能"认识"的方式?
就是使用 Kubernetes 的必备技能:编写配置文件。
这些配置文件可以是 YAML 或者 JSON 格式的。

Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器(虽然 Kubernetes 项目也支持这种方式,比如:kubectl run),而是希望你用 YAML 文件的方式,即:把容器的定义、参数、配置,统统记录在一个 YAML 文件中,然后用这样一句指令把它运行起来:

# kubectl create -f 我的配置文件

好处:
你会有一个文件能记录下 Kubernetes 到底"run"了什么。

使用YAML创建Pod

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

编写yaml文件内容如下:
---
apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web
    app1: abc234     //labels里面标签的值不能是纯数字
spec:
  containers:
    - name: front-end 
      image: daocloud.io/library/nginx
      ports:
        - containerPort: 80
        

创建Pod:

# kubectl apply -f pod.yaml
pod "kube100-site" created

验证语法:
当你不确定声明的配置文件是否书写正确时,使用以下命令要验证:

# kubectl create -f ./hello-world.yaml --validate

注:使用–validate只是会告诉你它发现的问题,仍然会按照配置文件的声明来创建资源,除非有严重的错误使创建过程无法继续,如必要的字段缺失或者字段值不合法,不在规定列表内的字段会被忽略。

查看pod状态
通过get命令来查看被创建的pod。
如果执行完创建pod的命令之后,你的速度足够快,那么使用get命令你将会看到以下的状态:

# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
hello-world   0/1       Pending   0          0s

# kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
kube100-site   2/2       Running   0          1m
注: Pod创建过程中如果出现错误,可以使用kubectl describe 进行排查。

各字段含义:
NAME: Pod的名称
READY: Pod的准备状况,右边的数字表示Pod包含的容器总数目,左边的数字表示准备就绪的容器数目。
STATUS: Pod的状态。
RESTARTS: Pod的重启次数
AGE: Pod的运行时间。

扫描二维码关注公众号,回复: 10211976 查看本文章

pod的准备状况指的是Pod是否准备就绪以接收请求,Pod的准备状况取决于容器,即所有容器都准备就绪了,Pod才准备就绪。这时候kubernetes的代理服务才会添加Pod作为分发后端,而一旦Pod的准备状况变为false(至少一个容器的准备状况为false),kubernetes会将Pod从代理服务的分发后端移除,即不会分发请求给该Pod。

一个pod刚被创建的时候是不会被调度的,因为没有任何节点被选择用来运行这个pod。调度的过程发生在创建完成之后,但是这个过程一般很快,所以你通常看不到pod是处于unscheduler状态的除非创建的过程遇到了问题。

pod被调度之后,分配到指定的节点上运行,这时候,如果该节点没有所需要的image,那么将会自动从默认的Docker Hub上pull指定的image,一切就绪之后,看到pod是处于running状态了:

# kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
my-nginx-379829228-2zjv3     1/1       Running   0          1h
my-nginx-379829228-mm8f8     1/1       Running   0          1h

查看pods所在的运行节点:

# kubectl get pods -o wide

查看pods定义的详细信息:

# kubectl get pods -o yaml
# kubectl get pod nginx-8v3cg --output yaml

kubectl get支持以Go Template方式过滤指定的信息,比如查询Pod的运行状态

# kubectl get pods busybox --output=go-template --template={{.status.phase}}
Running

查看pod输出:
你可能会有想了解在pod中执行命令的输出是什么,和Docker logs命令一样,kubectl logs将会显示这些输出:

# kubectl logs pod名称
hello world

查看kubectl describe 支持查询Pod的状态和生命周期事件:

[root@k8s-master ~]# kubectl describe   pod  busybox
Name:       busybox
Namespace:  default
Node:       k8s-node-1/116.196.105.133
Start Time: Thu, 22 Mar 2018 09:51:35 +0800
Labels:     name=busybox
        role=master
Status:     Pending
IP:     
Controllers:    <none>
Containers:
  busybox:
    Container ID:   
    Image:      docker.io/busybox
    Image ID:       
    Port:       
    Command:
      sleep
      360000
    State:          Waiting
      Reason:           ContainerCreating
    Ready:          False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:  <none>
Conditions:
  Type      Status
  Initialized   True 
  Ready     False 
  PodScheduled  True 
No volumes.
QoS Class:  BestEffort
Tolerations:    <none>
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason      Message
  --------- --------    -----   ----            -------------   --------    ------      -------
  7m        7m      1   {default-scheduler }            Normal      Scheduled   Successfully assigne
d busybox to k8s-node-1  7m     1m      6   {kubelet k8s-node-1}            Warning     FailedSync  Error syncing pod, s
kipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
  6m    13s 27  {kubelet k8s-node-1}        Warning FailedSync  Error syncing pod, skipping: failed to "StartContain
er" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

各字段含义:

Name: Pod的名称
Namespace: Pod的Namespace。
Image(s): Pod使用的镜像
Node: Pod所在的Node。
Start Time: Pod的起始时间
Labels: Pod的Label。
Status: Pod的状态。
Reason: Pod处于当前状态的原因。
Message: Pod处于当前状态的信息。
IP: Pod的PodIP
Replication Controllers:
 Pod对应的Replication Controller。
Containers:Pod中容器的信息
        Container ID: 容器的ID
        Image: 容器的镜像
        Image ID:镜像的ID
        State: 容器的状态
        Ready: 容器的准备状况(true表示准备就绪)。
        Restart Count: 容器的重启次数统计
        Environment Variables: 容器的环境变量
        Conditions: Pod的条件,包含Pod准备状况(true表示准备就绪)
        Volumes: Pod的数据卷
        Events: 与Pod相关的事件列表

进入Pod对应的容器内部

[root@k8s-master /]# kubectl exec -it myweb-76h6w /bin/bash

删除pod:

# kubectl delete pod pod名1 pod名2   //单个或多个删除
# kubectl delete pod --all   //批量删除

例:

[root@k8s-master /]# kubectl  delete pod hello-world
pod "hello-world" deleted

重新启动基于yaml文件的应用

# kubectl delete -f XXX.yaml
# kubectl apply -f XXX.yaml
发布了45 篇原创文章 · 获赞 26 · 访问量 4228

猜你喜欢

转载自blog.csdn.net/zy_xingdian/article/details/105084360
今日推荐