美文网首页Study
Kubernetes Tutorials

Kubernetes Tutorials

作者: OoChaseoO | 来源:发表于2017-06-28 10:57 被阅读131次

关于kubectl version正确的显示方式

Kubernetes交互时,使用命令kubectl,接下来详细解释kubectl,首先要检查kubectl是否已安装,运行kubectl version命令:

[centos@16 kubernetes]$ kubectl version

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f
3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"2017-01-12T04:57:25Z", GoVe
rsion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f
3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVe
rsion:"go1.7.1", Compiler:"gc", Platform:"linux/amd64"}

但是我本地的两个CentOS是这么显示╮(╯-╰)╭ :

[centos@16 kubernetes]$ kubectl version

Client Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.4", GitCommit:"d6f433224538d4f9ca2f7ae19b252e6fcb66a3ae", GitTreeState:"clean", BuildDate:"2017-05-19T18:44:27Z", GoVersion:"go1.7.5", Compiler:"gc", Platform:"linux/amd64"}
Error in configuration: 
* unable to read client-cert /kubernetes/path/to/my/client/cert for green-user due to open /kubernetes/path/to/my/client/cert: no such file or directory
* unable to read client-key /kubernetes/path/to/my/client/key for green-user due to open /kubernetes/path/to/my/client/key: no such file or directory
* unable to read certificate-authority /kubernetes/path/to/my/cafile for horse-cluster due to open /kubernetes/path/to/my/cafile: no such file or directory

[centos@35 ~]$ kubectl version

Client Version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.4", GitCommit:"d6f433224538d4f9ca2f7ae19b252e6fcb66a3ae", GitTreeState:"clean", BuildDate:"2017-05-19T18:44:27Z", GoVersion:"go1.7.5", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

关于kubectl cluster-info集群信息

运行中会有一个master和一个仪表板。 Kubernetes仪表板允许可以在UI中查看应用程序。 在本教程中,我们将专注于部署和探索我们的应用程序的命令行。 要查看群集中的节点,请运行kubectl get nodes命令:

[centos@35 ~]$ kubectl cluster-info

Kubernetes master is running at http://host01:8080
heapster is running at http://host01:8080/api/v1/proxy/namespaces/kube-system/services/heapst
kubernetes-dashboard is running at http://host01:8080/api/v1/proxy/namespaces/kube-system/ser
monitoring-grafana is running at http://host01:8080/api/v1/proxy/namespaces/kube-system/servi
monitoring-influxdb is running at http://host01:8080/api/v1/proxy/namespaces/kube-system/serv

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

我的:

[centos@16 ~]$ kubectl cluster-info

Kubernetes master is running at https://202.193.75.16:6443
KubeDNS is running at https://202.193.75.16:6443/api/v1/proxy/namespaces/kube-system/services/kube-dns

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

关于kubectl get nodes信息

此命令显示可用于托管我们的应用程序的所有节点。 现在我们只有一个节点,我们可以看到它的状态已经准备就绪(它准备好接受应用程序部署):

[centos@35 ~]$ kubectl get nodes

NAME      STATUS    AGE
host01    Ready     1m

关于kubectl run运行第一个应用

kubectl run命令在Kubernetes上运行第一个应用程序。 运行命令会创建一个新的部署,我们需要提供部署名称和应用程序映像位置(包括Docker外部托管的映像的完整存储库url)。 我们要在特定端口上运行应用程序,所以我们添加了--port参数

 [centos@35 ~]$ kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080 deployment "kubernetes-bootcamp" created

这时已经成功部署了一个应用。列出部署方案get deployments命令:

[centos@35 ~]$ kubectl get deployments

NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1           1                     1                       1               1m

可以看到有一个单节点的实例在运行,该实例正在节点上的Docker容器中运行。

kubernetes cluster

关于kubectl proxy代理路由

默认情况下,部署的应用智能在kubernetes集群内显示,外网公开之后介绍。我们将使用代理程序在终端和kubernetes集群创建一个路由。

[centos@35 ~]$ kubectl proxy

Starting to serve on 127.0.0.1:8001

此时,主机与kubernetes集群由了一个连接,proxy可以直接调用API,应用运行在Pod中,获取Pod的名称并将其存储在POD_NAME环境变量中:

[centos@35 ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME

nge .items}}{{.metadata.name}}{{"\n"}}{{end}}')mplate --template '{{ra
  > echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-390780338-cstrc

查看应用的输出结果,运行一个curl 请求

[centos@35 ~]$ curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/OD_NAME/ http://localhost:8001/api/v1/proxy/namespaces/default/pods/$P

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-cstrc | v=1

这个URL是路由通过API调用的Pod。

关于Pod的使用

Pod是kubernetes的最小单元,可以运行一个或者一组docker,可以共享资源:

  • 共享数据卷,Volumes
  • 共享网络,用集群IP作为唯一标识
  • 包括没个容器的信息,如容器的版本、端口
    一个Pod模型可以包含紧密耦合的不同应用的容器,比如es集群在Pod中可以共享IP和端口。
Pods overview

Pod存在在Node节点当中,其中每一个Nodes中包括Kubelet和Container,其概况如图所示:

Node overview

关于应用程序的使用

查看现有的Pods状态kubectl get命令:

[centos@35 ~]$  kubectl get pods

NAME                                  READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-390780338-f31jg   1/1       Running   0          1m

查看Pod内部的容器以及构建容器的镜像kubectl describe pods命令:

[centos@35 ~]$ kubectl describe pods

Name:           kubernetes-bootcamp-390780338-f31jg
Namespace:      default
Node:           host01/172.17.0.56
Start Time:     Wed, 28 Jun 2017 09:28:40 +0000
Labels:         pod-template-hash=390780338
                run=kubernetes-bootcamp
Status:         Running
IP:             172.18.0.2
Controllers:    ReplicaSet/kubernetes-bootcamp-390780338
Containers:
  kubernetes-bootcamp:
    Container ID:       docker://235537e3fd3014335a93d2045ced770995782654ede89a1d14e6da415247cb16
    Image:              docker.io/jocatalin/kubernetes-bootcamp:v1
    Image ID:           docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc
64af
    Port:               8080/TCP
    State:              Running
      Started:          Wed, 28 Jun 2017 09:28:40 +0000
    Ready:              True
    Restart Count:      0
    Volume Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-hg38n (ro)
    Environment Variables:      <none>
Conditions:
  Type          Status
  Initialized   True
  Ready         True
  PodScheduled  True
Volumes:
  default-token-hg38n:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-hg38n
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath                           Type            Reason          Mes
sage
  ---------     --------        -----   ----                    -------------                           --------        ------          ---
----
  8m            8m              1       {default-scheduler }                                            Normal          Scheduled       Suc
cessfully assigned kubernetes-bootcamp-390780338-f31jg to host01
  8m            8m              1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Pulled          Con
tainer image "docker.io/jocatalin/kubernetes-bootcamp:v1" already present on machine
  8m            8m              1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Created         Cre
ated container with docker id 235537e3fd30; Security:[seccomp=unconfined]
  8m            8m              1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Started         Sta
rted container with docker id 235537e3fd30

我们可以看到Pod中容器的IP,端口,生命周期等。默认情况下,Pod仅在集群中可见,所以要从主机访问应用还需要proxy创建主机与kubernetes集群的联系kubectl proxy,proxy命令在前台运行,所有的命令都在单独的终端中运行。所以输入命令启动一个新的终端,需要得到Pod的姓名,并且把POD_NAME存入环境变量。

[centos@35 ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME

nge .items}}{{.metadata.name}}{{"\n"}}{{end}}')mplate --template '{{ra
  > echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-390780338-nmk13

此时,输入curl可以查看输出结果

[centos@35 ~]$  curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-nmk13 | v=1

要获取这个容器的日志使用kubectl logs命令:

[centos@35 ~]$ kubectl logs $POD_NAME

Kubernetes Bootcamp App Started At: 2017-06-28T14:54:50.302Z | Running On:  kubernetes-bootca
Running On: kubernetes-bootcamp-390780338-nmk13 | Total Requests: 1 | App Uptime: 110.365 sec
Running On: kubernetes-bootcamp-390780338-nmk13 | Total Requests: 2 | App Uptime: 113.95 seco
Running On: kubernetes-bootcamp-390780338-nmk13 | Total Requests: 3 | App Uptime: 116.3 secon
Running On: kubernetes-bootcamp-390780338-nmk13 | Total Requests: 4 | App Uptime: 121.945 sec
Running On: kubernetes-bootcamp-390780338-nmk13 | Total Requests: 5 | App Uptime: 168.014 sec

关于execute命令的使用

比如使用exec和Pod_Name来查看环境变量:

[centos@35 ~]$  kubectl exec $POD_NAME env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-390780338-nmk13
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root

注意,因为我们只运行了一个Pod,所以我们可以省略容器本身的名字.下面,启动一个Pod容器:

[centos@35 ~]$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-390780338-nmk13:/#

通过curl检查应用启动情况:

root@kubernetes-bootcamp-390780338-b6dnp:/# curl localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-b6dnp | v=1

关于Replication Controller的操作

Pods有自己的生命周期,当工作节点死掉,Pods也会随着消失,此时,Replication Controller通过创建新的Pod来动态将集群控制在所需状态,从而保持程序的稳定运行.kubernetes集群的每一个Pod都有唯一的IP,Service是Kubernetes的一个抽象,它定义了一组逻辑的Pods和一个访问的策略,通常使用YAML或者JSON定义Service.首先检查运行中的应用kubectl get pods命令:

  > kubectl get pods

NAME                                  READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-390780338-rplf9   1/1       Running   0          11s

然后列出当前集群的Serviceskubectl get services命令:

  > kubectl get services

NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   2m

可以看到有一个名为kubernetes的服务随着Minikube启动而创建,要创建一个新的服务并将其暴露到外部,我们需要用到NodePortexpose命令:

  > kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service "kubernetes-bootcamp" exposed

此时在运行kubectl get services可以发现有了一个新的kubernetes-bootcamp的服务,并且发现服务有唯一IP和端口:

  > kubectl get services

NAME                  CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
kubernetes            10.0.0.1     <none>        443/TCP          5m
kubernetes-bootcamp   10.0.0.93    <nodes>       8080:30290/TCP   21s

要找出打开外部的什么端口(通过NodePort选项),我们将运行describe service命令:

  > kubectl describe services/kubernetes-bootcamp

Name:                   kubernetes-bootcamp
Namespace:              default
Labels:                 run=kubernetes-bootcamp
Selector:               run=kubernetes-bootcamp
Type:                   NodePort
IP:                     10.0.0.93
Port:                   <unset> 8080/TCP
NodePort:               <unset> 30290/TCP
Endpoints:              172.18.0.2:8080
Session Affinity:       None
No events.

创建一个名为NODE_PORT的环境变量,其值为Node端口:

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

spec.ports 0).nodePort}}')ectl get services/kubernetes-bootcamp -o go-template='{{(index .

  > echo NODE_PORT=$NODE_PORT
NODE_PORT=30290

此时我们可以使用curl通过节点的IP和暴露的外部端口来测试应用程序是否暴露:

 > curl host01:$NODE_PORT

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-rplf9 | v=1

部署自动为我们的Pod创建了一个标签。使用describe deployment命令可以看到标签的名称:

  > kubectl describe deployment

Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Thu, 29 Jun 2017 23:53:11 +0000
Labels:                 run=kubernetes-bootcamp
Selector:               run=kubernetes-bootcamp
Replicas:               1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
Conditions:
  Type          Status  Reason
  ----          ------  ------
  Available     True    MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet:  kubernetes-bootcamp-390780338 (1/1 replicas created)
Events:
  FirstSeen     LastSeen        Count   From                            SubObjectPath   TypeR
eason                   Message
  ---------     --------        -----   ----                            -------------   -----
---     ------                  -------
  14m           14m             1       {deployment-controller }                        Normal               
ScalingReplicaSet       Scaled up replica set kubernetes-bootcamp-390780338 to 1

可以看到标签name为kubernetes-bootcamp,我们可以通过get pod命令与-l作为参数:

  > kubectl get pods -l run=kubernetes-bootcamp

NAME                                  READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-390780338-rplf9   1/1       Running   0          23m

同理,通过get service来获取参数:

 > kubectl get services -l run=kubernetes-bootcamp

NAME                  CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
kubernetes-bootcamp   10.0.0.93    <nodes>       8080:30290/TCP   24m

获取pod名称并将其存储在POD_NAME环境变量中:

  > export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

  > echo Name of the Pod: $POD_NAME

Name of the Pod: kubernetes-bootcamp-390780338-rplf9

这是我们会感觉标签太复杂,我们可以通过kubectl label命令来修改标签:

  > kubectl label pod $POD_NAME app=v1

pod "kubernetes-bootcamp-390780338-rplf9" labeled

此时的标签名变为app=v1,查看可以得出:

> kubectl describe pods $POD_NAME

Start Time:     Thu, 29 Jun 2017 23:53:15 +0000
Labels:         app=v1
                pod-template-hash=390780338
                run=kubernetes-bootcamp
Status:         Running
IP:             172.18.0.2
Controllers:    ReplicaSet/kubernetes-bootcamp-390780338
Containers:
  kubernetes-bootcamp:
    Container ID:       docker://5ead2d54a8ecf52b20971e79277b8466a47fcfcd031b7a358eb8e482e7fa3d1e
    Image:              docker.io/jocatalin/kubernetes-bootcamp:v1
    Image ID:           docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc
64af
    Port:               8080/TCP
    State:              Running
      Started:          Thu, 29 Jun 2017 23:53:16 +0000
    Ready:              True
    Restart Count:      0
    Volume Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2rbf0 (ro)
    Environment Variables:      <none>
Conditions:
  Type          Status
  Initialized   True
  Ready         True
  PodScheduled  True
Volumes:
  default-token-2rbf0:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-2rbf0
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath                           Type            Reason          Mes
sage
  ---------     --------        -----   ----                    -------------                           --------        ------          ---
----
  33m           33m             1       {default-scheduler }                                            Normal          Scheduled       Suc
cessfully assigned kubernetes-bootcamp-390780338-rplf9 to host01
  33m           33m             1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Pulled          Con
tainer image "docker.io/jocatalin/kubernetes-bootcamp:v1" already present on machine
  33m           33m             1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Created         Cre
ated container with docker id 5ead2d54a8ec; Security:[seccomp=unconfined]
  33m           33m             1       {kubelet host01}        spec.containers{kubernetes-bootcamp}    Normal          Started         Sta
rted container with docker id 5ead2d54a8ec

可以发现标签名称已经为app=v1,此时可以通过先标签来查看信息:

> kubectl get pods app=v1

NAME                                  READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-390780338-rplf9   1/1       Running   0          37m

删除service可以使用delete service命令,可以通过标签来调用:

> kubectl delete service -l run=kubernetes-bootcamp

service "kubernetes-bootcamp" deleted

查看service会发现我们创建的kubernetes-bootcamp:

>kubectl get services

NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   41m

此时service已删除,这个应用不再暴露到外部,但是我们它仍然存在在pod当中,可以通过kubectl exec查看,并且可以看出应用正在启动中:

 > kubectl exec -ti $POD_NAME curl localhost:8080

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-390780338-rplf9 | v=1

相关文章

网友评论

    本文标题:Kubernetes Tutorials

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