kubernetes_book

v1.14

所有机器:

swapoff -a

apt-get install docker.io

 

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

systemctl enable docker.service

 

master上执行:

kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=0.0.0.0

mkdir -p $HOME/.kube                      #这样执行kubectl get cs不会报错

cp -i /etc/kubernetes/admin.conf ~/.kube/config            #这样执行kubectl get cs不会报错,get cs == get compontsstatuses 验证其各组件的运行是否正常。

 

 

验证:

kubectl get cs    #get cs == get compontsstatuses 验证其各组件的运行是否正常。

NAME                 STATUS    MESSAGE             ERROR

scheduler            Healthy   ok                  

controller-manager   Healthy   ok                  

etcd-0               Healthy   {"health":"true"} 

 

安装flannel网络:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

 验证:

kubectl get nodes会变成Ready状态

 

 kubectl get pods -n kube-system| grep flannel  #也会显示Running

 

获取集群状态信息:

 

kubectl cluster-info

Kubernetes master is running at https://192.168.204.13:6443

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

 

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

 

 

 

kubectl version

Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

 

 

 

 

kubectl version --short=true

Client Version: v1.14.0

Server Version: v1.14.0

 

集群重置:

kubeadm reset

 

查看所有集群:

kubectl get nodes

 

从集群移除节点:

master上执行:

kubectl drain NODE_ID --delete-local-data --force --ignore-daemonsets

kubectl delete node NODE_ID

node上执行:

kubeadm reset

 

2.3 kubectl常用命令:

1.创建资源对象

kubectl run nginx-deploy --image=nginx:1.12 --replicas=2

kubectl expose deployment/nginx-deploy --name=nginx-svc --port=80

curl 10.105.148.56

 

也可以根据资源清单创建资源对象,

kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml

 

还可以将创建交由kubectl自行确定,用户只需要生命期望的状态。假设存在定义了Deployment对象的nginx-deploy.yaml,以及定义了Service对象的nginx-svc.yaml文件,那么使用kubectl apply命令即可实现声明式配置:

kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml

 

2.查看资源对象

列出所有的namespace资源对象

 kubectl get namespaces

NAME              STATUS   AGE

default           Active   4d1h

kube-node-lease   Active   4d1h

kube-public       Active   4d1h

kube-system       Active   4d1h

 

也可以一次查看多个资源类别下的资源对象,例如,列出默认名称空间内的所有pod和service对象

kubectl get pods,services -o wide

NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES

pod/nginx-deploy-64d85b778b-h82wl   1/1     Running   0          14m   10.244.1.3   ip-192-168-204-252   <none>           <none>

pod/nginx-deploy-64d85b778b-lssl4   1/1     Running   0          14m   10.244.2.3   ip-192-168-204-90    <none>           <none>

 

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR

service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d1h   <none>

service/nginx-svc    ClusterIP   10.105.148.56   <none>        80/TCP    12m    run=nginx-deploy

 

 

 

kubectl get pods,services

NAME                                READY   STATUS    RESTARTS   AGE

pod/nginx-deploy-64d85b778b-h82wl   1/1     Running   0          16m

pod/nginx-deploy-64d85b778b-lssl4   1/1     Running   0          16m

 

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE

service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d1h

service/nginx-svc    ClusterIP   10.105.148.56   <none>        80/TCP    14m

 

 

列出kube-namespace名称空间中拥有k8s-app标签名称的所有Pod对象。

kubectl get pods -l k8s-app -n kube-system

NAME                      READY   STATUS    RESTARTS   AGE

coredns-fb8b8dccf-mcwrw   1/1     Running   0          4d1h

coredns-fb8b8dccf-zv7mj   1/1     Running   0          4d1h

kube-proxy-6lc26          1/1     Running   0          4d1h

kube-proxy-7jgvg          1/1     Running   0          4d1h

kube-proxy-zh4dc          1/1     Running   0          4d1h

 

 

3.打印资源对象的详细信息

kubectl -o {yaml|json}   或者 kubectl describe 都能打印出指定资源对象的详细描述信息。

例如:查看kube-system名称空间中拥有标签component=kube-apiserver的Pod对象的资源配置清单(期望状态Spek)及当前的状态信息,并输出位yaml格式

kubectl get pods -l component=kube-apiserver -o yaml -n kube-system

 

而kubectl describe命令还能显示与当前对象相关的其他资源对象,如event,controller等。例如,查看kybe-system名称空间中拥有标签component=kube-apiserver的Pod对象的额详细描述信息:

kubectl describe pods -l component=kube-apiserver -n kube-system

 

 

 

4.打印容器中的日志信息

例如:查看名称空间kube-system中仅有一个容器的Pod对象kube-apiserver-master.ilinux.io的日志

kubectl logs kube-apiserver-master.ilinux.io -n kube-system

如果添加-f选项,可以持续输出。

 

 

 

5.在容器中执行命令

例如在kube-system名称弓箭中的pod对象kube-apiserver-master.ilinux.io上的唯一容器中运行ps命令:

kubectl exec kube-apiserver-master.ilinux.io -n kube-system -- ps

如果pod对象中存在多个容器,则需要以-c选项,指定容器后再运行。

 

 

6.删除资源对象

对于受控于控制器的对象来说,删除之后其控制器可能会重建出类似的对象,例如,deployment控制旗下的epod对象在呗删除时就会被重建。

例如:删除默认名称空间中名为nginx-svc的service资源对象

kubectl delete services nginx-svc

 

下面的命令可用于删除kube-system名称空间中拥有标签k8s-app=kube-proxy的所有pod对象

kubectl delete pods -l app=monitor -n kube-system

 

若要删除指定名称空间中的素有的某类对象,可以使用kubectl delete TYPE --all -n NS

例如删除kube-public名称空间中的所有pod对象:

kubectl delete pods --all -n kube-public

 

 

 

2.4命令式容器应用编排

采用示例镜像"ikubernetes/myapp:v1"来演示容器应用编排的基础操作:

1.创建并管控pod对象以运行特定的应用程序。无状态(stateless)应用的部署和控制通常使用Deployment控制器进行,而有状态的应用则需要使用StatefulSet控制器

2.为pod对象创建service对象。以便向客户端提供固定的访问路径,并借助于coredns进行服务发现。

3.随时按需获取各资源对象的简要或详细信息,了解其运行状态。

4.如有需要,则手动支持扩缩容的Controller组件进行扩容或缩容。

5.滚动更新:当应用程序的镜像出现新版本时,对其执行更新操作,可以更新,回滚

 

 

2.4.1部署应用pod

1.创建deployment控制器对象

kubectl run命令可于命令行直接创建deployment控制器,并以--image选项指定的镜像运行pod中的容器,--dry-run选项可用于命令的测试运行,但并未真正执行资源对象的创建过程。

例如:创建一个名为myapp的deployment控制器对象,他使用镜像ikubenetes/myapp:v1创建pod对象,但仅在测试运行后马上退出。

 

kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1 --dry-run #测试,--port=80来指明容器要暴露的端口。

kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1 正式运行

deployment资源对象通过ReplicaSet控制器实例完成对Pod对象的控制。而非直接控制。另外通过控制器创建的pod对象都会被自动附加一个标签。格式为“run=<Controller_Name>”。例如上面所创建的pod,会有"run=myapp"标签

 

kubectl run 命令的其他选项:

-l,--labels: 为pod对象设定自定义标签

--record,是否将当前的对象创建命令保存至对象的annotation中,其值为true或false

--save-config,是否将当前对象的配置信息保存至annotation中,其值为true或false

--restart=Never,创建不受控制器管控的自主式pod对象

 

 

2.打印资源对象的相关信息

kubectl get deployments

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   2/2     2            2           21h

 

kubectl get deployments -o wide

NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS     IMAGES                 SELECTOR

myapp          1/1     1            1           73m   myapp          ikubernetes/myapp:v1   run=myapp

nginx-deploy   2/2     2            2           23h   nginx-deploy   nginx:1.12             run=nginx-deploy

 

root@ip-192-168-204-13:~# kubectl get pods

NAME                            READY   STATUS    RESTARTS   AGE

myapp-5c647497bf-pl4xj          1/1     Running   0          73m

nginx-deploy-64d85b778b-h82wl   1/1     Running   0          23h

nginx-deploy-64d85b778b-lssl4   1/1     Running   0          23h

root@ip-192-168-204-13:~# kubectl get pods -o wide

NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES

myapp-5c647497bf-pl4xj          1/1     Running   0          73m   10.244.1.4   ip-192-168-204-252   <none>           <none>

nginx-deploy-64d85b778b-h82wl   1/1     Running   0          23h   10.244.1.3   ip-192-168-204-252   <none>           <none>

nginx-deploy-64d85b778b-lssl4   1/1     Running   0          23h   10.244.2.3   ip-192-168-204-90    <none>           <none>

 

 

2.4.2探查pod及应用详情

1.查看pod对象的详细描述

kubectl describe pods xxxxx

2.查看容器日志

kubectl logs xxxxx

3.在容器中运行额外的程序

kubectl exec xxx ps aux

进入容器的bash

kubectl -it exec xxxxx /bin/sh

 

 

2.4.3部署service对象

一个service对象可视作通过标签选择器过滤出的一组pod对象。并为此组pod对象监听的套接字提供端口代理及调度服务。

1.创建service对象

kubectl expose命令可用于创建service对象以将应用程序暴露于网络中。

例如,下面的命令即可将myapp创建的pod对象使用NodePort类型的服务暴露到集群外部

kubectl expose deployments/myapp --type="NodePort" --port=80 --name=myapp               #type选项用于指定service的类型,port用于指定要暴露的容器端口,䯮service对象的名称为myapp

 

然后通过

kubectl get svc   获取myapp的端口号,比如30676

curl 192.168.204.13:30676

或者

curl 10.109.187.139

 

而上面的nginx-svc只能通过curl 10.105.148.56来访问

 

例如:运行同一集群的pod对象中的客户端程序发起访问测试。kubectl run命令创建一个pod对象,myapp即service对象名称,default即其所属的namespace对象的名称:

kubectl run client --image=bsybox --restart=Never -it -- /bin/sh

wget -O - -q http://myapp.default:80

创建时,service对象名称及其clusterIp会有coreDNS附件动态添加至名称解析库当中。因此,名称解析服务在对象创建后即可直接使用

 

kubectl get svc/myapp

NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

myapp   NodePort   10.109.187.139   <none>        80:30676/TCP   44m

ports字段表明,集群中各工作节点会补货发往本地的目标端口为30676的流量,转发至当前service对象的80端口。cluster-ip字段为当前service的IP地址,他是一个虚拟ip,并没有配置于集群中的任何主机的任何接口之上,但每个node之上的kube-proxy都会为cluster-ip所在的网络创建用于转发的iptables或ipvs规则。

 

创建service对象的另一种方式是使用kubectl create service命令,对应于每个类型,分别有一个专用的自命令,例如kubectl create service clusterip,kubectl create service nodeport等。

 

2.查看service资源对象的描述

kubectl describe services myapp-svc

Name:                     myapp

Namespace:                default

Labels:                   run=myapp

Annotations:              <none>

Selector:                 run=myapp

Type:                     NodePort                 #其值可以是ClusterIP,NodePort和LoadBalancer等其中之一

IP:                       10.109.187.139      #dangqian service对象的ClusterIp

Port:                     <unset>  80/TCP      #暴露的端口,即当前service勇于接受并相应请求的端口

TargetPort:               80/TCP            #容器中用于暴露的目标端口,由service port路由请求至此端口

NodePort:                 <unset>  30676/TCP      #当前Service的NodePort,他是否存在有效值与type字段中的类型相等。

Endpoints:                10.244.1.4:80        #后端端点,即被当前Service的Selector挑中的所有Pod的ip及端口

Session Affinity:         None             #是否启用回话粘性

External Traffic Policy:  Cluster            #外部流量的调度策略

Events:                   <none>

 

2.4.4扩容和缩容

例如,如果要将myapp的pod副本数量扩展到3个

kubectl scale deployments/myapp --replicas=3

验证:

kubectl get pods -l run=myapp

kubectl describe deployments/myapp

kubectl describe services/myapp

while ture;do wget -O - -q http://myapp.default:80/hostname.html;sleep 1;done

 

缩容:

kubectl scale deployments/myapp --replicas=2

 

2.4.5修改和删除对象

kubectl edit services/myapp   #实时生效

kubectl delete service myapp   #删除service

kubectl delete deployment --all   #删除默认名称空间中所有的deployment控制器,需要注意的是,受控于控制器的pod对象在删除后会被重建。删除此类对象需要直接删除其控制器对象。不过,删除控制器时若不想删除其pod对象,可在删除命令上使用--cascade=false选项。

 

 

 

 

3.1.1kubernetes资源对象

1)工作负载型资源

应用程序分为无状态和有状态两种类型。

无状态应用:ReplicationController,ReplicaSet,Deployment

有状态应用:StatefulSet.

ReplicationController是上一代的控制器,其功能由ReplicaSet和Deployment负责时间,因此几近于废弃。

负责收集日志或运行系统服务:DaemonSet控制器

有些容器应用需要继续运行以为守护进程不间断提供服务,而有些则应该在正常完成后退出,这些在正常完成后就应该退出的容器化应用则由Job控制器负责管控。

ReplicationController:用于确保每个Pod副本在任一适合均能满足目标数量,他是上一代的无状态pod应用控制器,建议使用Deployment和ReplicaSet来取代他

ReplicaSet:新一代ReplicationController,与ReplicationController的唯一不同之处在于支持的标签选择器不同,Controller只支持等值选择器,而Set额外支持基于集合的选择器。

Deployment:用于管理无状态的持久化应用,例如http服务器;用于为Pod和ReplicaSet提供声明式更新,是构建在ReplicaSet之上的更为高级的控制器。

StatefulSet:用于管理有状态的持久化应用,如database服务程序;与deployment的不同之处在于statefulset会为每个pod创建一个独有的持久性标识符,并会确定各pod之间的顺序性。

DaemonSet:用于确保每个节点都运行了某pod的一个副本,新增的节点一样会被添加此类pod。在节点移除时,此类pod会被回收。daemonSet常用语运行集群存储守护进程,如glusterd和ceph;还有日志收集进程,如fluentd和logstash;以及监控进程,如prometheus的node exporter,collectd,datadog agent和ganglia的gmond等

job:用于管理运行完成后即可终止的应用,批处理作业任务。job创建一个或多个pod,并确保其符合目标数量,直到pod正常结束而终止。

 

 

2)发现和负载均衡

service资源和endpoint资源,以及通过七层代理实现请求流量负载均衡的ingress资源。

 

3)配置与存储

k8s设计了Volume资源,他支持众多类型的存储设备或存储系统,如glusterFs,CEPH RBD和Flocker等。

ConfigMap资源能够以环境变量或存储卷的方式接入到Pod资源的容器中,并且可被多个同类的pod共享引用,从而实现一次修改,多处生效。

 

 

3.1.2 api群组:

kubectl api-versions

admissionregistration.k8s.io/v1beta1

apiextensions.k8s.io/v1beta1

apiregistration.k8s.io/v1

apiregistration.k8s.io/v1beta1

apps/v1

apps/v1beta1

apps/v1beta2

authentication.k8s.io/v1

authentication.k8s.io/v1beta1

authorization.k8s.io/v1

authorization.k8s.io/v1beta1

autoscaling/v1

autoscaling/v2beta1

autoscaling/v2beta2

batch/v1

batch/v1beta1

certificates.k8s.io/v1beta1

coordination.k8s.io/v1

coordination.k8s.io/v1beta1

events.k8s.io/v1beta1

extensions/v1beta1

networking.k8s.io/v1

networking.k8s.io/v1beta1

node.k8s.io/v1beta1

policy/v1beta1

rbac.authorization.k8s.io/v1

rbac.authorization.k8s.io/v1beta1

scheduling.k8s.io/v1

scheduling.k8s.io/v1beta1

storage.k8s.io/v1

storage.k8s.io/v1beta1

v1

 

 

3.1.3访问k8s REST API

启动proxy网关:

kubectl proxy --port=8080     在本地启动一个代理网关,启动在127.0.0.1

例如:请求k8s集群上的NamespaceList资源对象,即列出集群上所有的Namespace对象:

curl localhost:8080/api/v1/namespaces/

 

或者使用json的命令行处理器jq命令对相应的json数据流进行内容过滤,例如,显示相关的NamespaceList对象中的各成员对象:

curl -s localhost:8080/api/v1/namespaces/ | jq .items[].metadata.name

"default"

"kube-node-lease"

"kube-public"

"kube-system"

 

给出特定的Namespace资源对象的名称则能直接获取相应的资源信息,以kube-system名称空间为例:

curl -s localhost:8080/api/v1/namespaces/kube-system

 

 

3.2.1资源配置清单

kubectl get TYPE/NAME -o yaml 命令也可以获取任何一个对象yaml格式的配置清单,或者使用 kubectl get TYPE/NAME -o json获取json格式的配置清单

kubectl get namespace kube-system -o yaml

apiVersion: v1

kind: Namespace

metadata:

  creationTimestamp: "2019-04-03T10:08:30Z"

  name: kube-system

  resourceVersion: "4"

  selfLink: /api/v1/namespaces/kube-system

  uid: 6e766e97-55f8-11e9-8325-0a7f67c6bece

spec:

  finalizers:

  - kubernetes

status:

  phase: Active

 

 

例如,下面就是一个创建Namespace资源时提供的资源配置清单示例:

apiVersion: v1

kind: Namespace

metadata:

  name: dev

spec:

  finalizers:

  - kubernetes

将上面的内容保存在文件中,使用kubectl create -f /path/file 就能将他创建到集群中。

 

 

 kubectl get deployment myapp -o yaml     #显示前面myapp的状态信息

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  annotations:

    deployment.kubernetes.io/revision: "1"

  creationTimestamp: "2019-04-08T09:26:42Z"

  generation: 1

  labels:

    run: myapp

  name: myapp

  namespace: default

  resourceVersion: "623552"

 

 

3.2.4 资源配置清单格式文档

用户可以使用kubectl explain命令直接获取相关的使用帮助。例如要了解pod资源的一级字段,可以使用类似如下的命令,显示支持使用的各一组字段及其说明:

kubectl explain pods

 

需要了解某以及字段表示的对象之下的耳机对象字段时,只需要指定一级字段的对象名称。例如查看pod资源的spec对象支持嵌套使用的二级字段:

kubectl explain pods.spec

 

 

以现有活动对象的清单为模板可以更快的生成目标资源的配置文件,命令格式为kubectl get TYPE/NAME -o yaml --export      其中--export用于省略输出由系统生成的信息。

例如,用现有的deployment资源对象myapp生成配置模板deploy-demo.yaml可以使用下面命令:

kubectl get deployment myapp -o yaml --export > deploy-demo.yaml

 

 

 

 

 

 

posted @ 2019-04-03 19:02  alexhe  阅读(400)  评论(0编辑  收藏  举报