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