美文网首页
k8s 学习笔记:2 测试一个容器应用

k8s 学习笔记:2 测试一个容器应用

作者: 董泽润 | 来源:发表于2019-02-28 14:24 被阅读4次

上一节搭建了 k8s 集群环境,两台机器,一台 master, 一个 worker. 就像一个机器的池子一样,我的应用以 pod 的形式跑在某台机器上,这个应用所需要 cpu, memory 等资源都会由 k8s 来调度

启动两个 nginx 应用

k8s 描述一个 pod 都会用 yaml 配置,而不是裸用 docker run 去跑

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

上面定义一个 nginx-deployment.yaml, 其中 replicas: 2 表示启动两个的意思,其它暂时不管了,也看不懂

kubectl create -f nginx-deployment.yaml

然后执行查看命令

kubectl get pods --all-namespaces
或是
kubectl get pods -l app=nginx
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76bf4969df-t5cj4   1/1     Running   0          36m
nginx-deployment-76bf4969df-zc8pc   1/1     Running   0          36m

可以看到两个 nginx 的 pod 正在运行

查看 nginx pod

此时己经运行了两个 nginx pod, 查看详细信息

kubectl describe pod nginx-deployment-76bf4969df-t5cj4
Name:               nginx-deployment-76bf4969df-t5cj4
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               jjh-fusion-sre-backup3/10.20.76.23
Start Time:         Wed, 27 Feb 2019 14:41:29 +0800
Labels:             app=nginx
                    pod-template-hash=76bf4969df
Annotations:        <none>
Status:             Running
IP:                 10.44.0.9
Controlled By:      ReplicaSet/nginx-deployment-76bf4969df
Containers:
  nginx:
    Container ID:   docker://5fc7612b01cb8f6148c4306db73565a30989bda932ec13aa82d07507a96ae33e
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 27 Feb 2019 14:41:54 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-r78v4 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-r78v4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-r78v4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From                             Message
  ----    ------     ----  ----                             -------
  Normal  Scheduled  40m   default-scheduler                Successfully assigned default/nginx-deployment-76bf4969df-t5cj4 to jjh-fusion-sre-backup3
  Normal  Pulling    40m   kubelet, jjh-fusion-sre-backup3  pulling image "nginx:1.7.9"
  Normal  Pulled     40m   kubelet, jjh-fusion-sre-backup3  Successfully pulled image "nginx:1.7.9"
  Normal  Created    40m   kubelet, jjh-fusion-sre-backup3  Created container
  Normal  Started    40m   kubelet, jjh-fusion-sre-backup3  Started container

可以看到分配的 ip 是 10.44.0.9,那么直接访问就可以了

curl http://10.44.0.9

下面还有镜像的详细信息,运行在 worker 机器上面等等。一般来说,对一个应用做的所有操作,都会返映在 describe 信息里面

升级 nginx

修改 nginx-deployment.yaml 文件,将 nginx 版本变成 1.8

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.8
        ports:
        - containerPort: 80

执行以下命令应用

kubectl apply -f nginx-deployment.yaml

查看当前 pods

# kubectl get pods -l app=nginx
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5896fbb489-8zjdg   1/1     Running   0          18s
nginx-deployment-5896fbb489-dczqn   1/1     Running   0          37s

查看详细某一个 pod

# kubectl describe pod nginx-deployment-5896fbb489-8zjdg
Name:               nginx-deployment-5896fbb489-8zjdg
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               jjh-fusion-sre-backup3/10.20.76.23
Start Time:         Wed, 27 Feb 2019 15:32:06 +0800
Labels:             app=nginx
                    pod-template-hash=5896fbb489
Annotations:        <none>
Status:             Running
IP:                 10.44.0.9
Controlled By:      ReplicaSet/nginx-deployment-5896fbb489
Containers:
  nginx:
    Container ID:   docker://dfeb8fed612173c94d0c48547d068025fa8e76d4c6e6fa39e24b9ceeae58de0d
    Image:          nginx:1.8
    Image ID:       docker-pullable://nginx@sha256:c97ee70c4048fe79765f7c2ec0931957c2898f47400128f4f3640d0ae5d60d10
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 27 Feb 2019 15:32:08 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-r78v4 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-r78v4:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-r78v4
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From                             Message
  ----    ------     ----  ----                             -------
  Normal  Scheduled  57s   default-scheduler                Successfully assigned default/nginx-deployment-5896fbb489-8zjdg to jjh-fusion-sre-backup3
  Normal  Pulled     55s   kubelet, jjh-fusion-sre-backup3  Container image "nginx:1.8" already present on machine
  Normal  Created    55s   kubelet, jjh-fusion-sre-backup3  Created container
  Normal  Started    55s   kubelet, jjh-fusion-sre-backup3  Started container

可以看到,己经变成了 nginx 1.8 的版本

挂载 volume 卷

现在对这个 nginx pod 增加 volume,挂载点是 /usr/share/nginx/html

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.8
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: nginx-vol
      volumes:
      - name: nginx-vol
        emptyDir: {}

挂载的卷是 nginx-vol,emptyDir 表示在宿主机临时生成一个目录。重新应用这个 yaml

kubectl apply -f nginx-deployment.yaml

然后立马查看 pods 状态,会发现在滚动升机重启

# kubectl get pods
NAME                                READY   STATUS        RESTARTS   AGE
nginx-deployment-5896fbb489-dczqn   0/1     Terminating   0          20h
nginx-deployment-58bbdfd545-4rg8s   1/1     Running       0          10s
nginx-deployment-58bbdfd545-69kp5   1/1     Running       0          12s

通过 describe 查看其中一个 pod 详情

# kubectl describe pod nginx-deployment-58bbdfd545-4rg8s
Name:               nginx-deployment-58bbdfd545-4rg8s
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               jjh-fusion-sre-backup3/10.20.76.23
Start Time:         Thu, 28 Feb 2019 11:50:21 +0800
Labels:             app=nginx
                    pod-template-hash=58bbdfd545
Annotations:        <none>
Status:             Running
IP:                 10.44.0.9
Controlled By:      ReplicaSet/nginx-deployment-58bbdfd545
Containers:
  nginx:
    Container ID:   docker://fc26530dbc54377c7034700777498d6815ca8d578806c03c4175a33388cd3f9b
    Image:          nginx:1.8
    Image ID:       docker-pullable://nginx@sha256:c97ee70c4048fe79765f7c2ec0931957c2898f47400128f4f3640d0ae5d60d10
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 28 Feb 2019 11:55:49 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Thu, 28 Feb 2019 11:50:23 +0800
      Finished:     Thu, 28 Feb 2019 11:55:47 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from nginx-vol (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-r78v4 (ro)

可以看到 Mounts 挂载信息,此时我们访问这个 nginx 会报错

# curl http://10.44.0.9
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.8.1</center>
</body>
</html>

因为我们此时目录虽然挂载了,但是是空的,所以需要进入容器中写一个 html,进到 node 机器上 docer ps 查看 nginx 容器的 ID

docker exec -it e3c3007ad67a /bin/bash

也可以直接用 kubectl 命令来操作,这样就完全屏敝了底层 docker

kubectl exec -it nginx-deployment-58bbdfd545-4rg8s -- /bin/bash

然后随变写一个 hello world

echo "hello world" >> /usr/share/nginx/html/index.html

此时再访问就会看到 hello world

小结

至此,己经成功用 k8s 集群创建了第一个应用,还有很多概念与功能不太熟悉。万事开头难,搞起~~~

相关文章

网友评论

      本文标题:k8s 学习笔记:2 测试一个容器应用

      本文链接:https://www.haomeiwen.com/subject/foffuqtx.html