k = kubectl
2. 开始使用Kubernetes和Docker
-
busybox是一个单一可执行文件,包含多种标准的UNIX命令行工具,如:echo,ls, gzip等,除了包含echo命令的busybox命令,也可以使用如Fedora,Ubuntu等功能完备的镜像
使用docker run命令然后指定需要运行的镜像的名字,以及需要执行的命令(可选)
docker run busybox echo "Hello World"
-
运行镜像
docker run <image> docker run <image>:<tag>
-
构建镜像
docker build -t <image-name> .
-
docker images
-
运行镜像
docker run --name <container-name> -p 8080:8080 -d <image-name>
-
docker ps
-
docker ps
只会展示容器的基本信息,使用docker inspect
获得更多信息docker inspect <container-name>
-
容器内部执行shell
docker exec -it <container-name> bash
-
停止容器
docker stop <container-name>
-
删除容器
docker rm <container-name>
-
使用附加标签标注镜像
docker tag <old-image-name> <new-image-name>
多了一个镜像(new-container-name),实际上两个是同一个镜像,只不过是同一个镜像的两个标签
-
向dockerHub推送镜像
docker push <image-name>
-
展示集群信息
k cluster-info
-
在GKE上创建一个三节点集群
gcloud container clusters create kubia --num-nodes 3 --machine-type f1-micro
-
k get nodes
-
登入某一个节点内部,查看节点上运行了什么
gcloud compute ssh <node-name>
-
查看对象的更多信息
k describe node <node-name>
-
k get pods k get pods -a (或 --show-all)
-
部署一个应用
-
k run kubia --image=luksa/kubia --port=8080 --generator=run/v1 --创建rc k run kubia --image=luksa/kubia --port=8080 --generator=run-pod/v1 --command -- sleep infinity --直接创建一个pod image:指定要运行的容器镜像 port:应用正在监听8080端口 generator: 告诉k8s创建一个rc而不是deployment
-
创建一个服务对象
k expose rc kubia --type=LoadBalance --name kubia-http
-
k get service/svc
-
增加期望的副本数
k scale rc kubia --replicas=3
-
列出pod时显示podIP和所在节点
k get pods -o wide
3. 运行于kubernetes中的容器
-
得到一个资源的yaml描述文件
k get pods <pod-name> -o yaml/json
-
从yaml文件创建资源
k create -f --.yaml
-
查看容器日志,进入pod运行以下命令
docker logs <container id>
-
或者直接
k logs <pod name>
-
获取多容器pod日志,通过-c指定容器
k logs <pod name> -c <container name>
-
如果想要在不通过service的情况下于某个特定的pod通信,k8s允许我们配置端口转发到该pod,例如以下命令将本地端口8888转发到
kubia-manual
pod的8080端口k port-forward kubia-manual 8888->8080
-
查看pod时列出标签
k get pod --show-labels
-
如果只对某些标签感兴趣,用-L指定
k get pods -L creation_method, env
只要求列出
creation_methos
,env
两个标签的值 -
为现有pod添加标签
k label po <pod name> newlabel=value (node同样)
-
修改pod的标签
k label po <pod name> env=debug --overwrite
-
标签选择器
k get pods -L env=debug (L可以小写) pod可以与标签选择器如下匹配: a. env!=debug --选择带有env标签,并且值不等于debug的pod b. k get po -l '!env' --列出没有env标签的pod,确保使用单引号来圈引!env,这样bash shell才不会 解释感叹号(感叹号在bash中有特殊含义,表示事件指示器) c. env in (prod,debug) --选择带有env标签且值为prod或debug的pod d. env notin (prod,debug) --选择带有env标签,但其值不是prod或debug的pod
-
添加和修改注解
k annotate pod <pod-name> mycompany.com/someannotation="foo bar"
-
k get ns
-
k get po --namespace kube-system --特定命名空间的pod
-
创建命名空间
k create namespace custom-namespace
-
创建资源时指定命名空间
k create -f ~~.yaml -n namespace-name
-
按名称删除pod
k delete po kubia-gpu
-
使用标签选择器删除pod
k delete po -l creation_method=manual
-
删除整个命名空间
k delete ns custom-namespace
-
删除命名空间中的所有pod,但保留命名空间
k delete po --all
-
删除命名空间中的所有资源
k delete all --all
-
想看上一个容器是因为什么终止的
k logs mypod --previous
4. 副本机制和其他控制器:部署托管的pod
-
编辑rc
k edit rc kubia
-
删除rc时,通过–cascade=false保持pod的运行
k delete rc kubia --cascade=false
-
k get rs
-
replicaSet与标签选择器
selector: matchLabels: app: kubia ... 或 selector: matchExpressions: - key: app --必须包含该标签 operation: In values: - kubia --标签的值必须是kubia ... 选择器的运算符 In: Label的值必须与其中一个指定的values匹配 NotIn:Label的值与任何指定的values不匹配 Exists: pod必须包含一个指定名称的标签(值不重要),使用此运算符时,不应指定values字段 DoesNotExists: pod不得包含有指定名称的标签,values属性不得指定 如果指定了多个表达式,则所有这些表达式都必须为true才能使选择器与pod匹配 。如果同时指定matchLabels和matchExpressions,则所有标签都必须匹配,并且所有表达式必须计算为true以使该pod与选择器匹配
-
k delete rs kubia
-
k get ds/DaemonSet
-
job
-
k get jobs
-
apiVersion: batch/v1 kind: Job metadata: name: job-test spec: completions: 5 --必须确保5个job成功完成 parallelism: 2 --最多两个pod可以并行运行
-
Job的缩放
job的缩放是针对parallelism的 k scale job job-test --replicas 3 --现在有三个pod在运行了
5. 服务:让客户端发现pod并与之通信
-
在运行的容器中远程执行命令
k exec kubia-7nog1 -- curl -s http://10.111.249.153 --:双横杠代表着kubectl命令项的结束,在两个横杠之后的内容是指在pod内部需要执行的命令,如果需要执行的命令并没有以横杠开始的参数,横杠也不是必需的,-s用来告诉kubectl需要连接一个不同的API服务器而不是默认的 k exec --v=9 kubia-7nog1 ... ---查看执行过程
-
k get endpoints
-
k get ingresses
-
k apply -f ~~.yaml --更新资源
-
使用pod执行DNS查找
k exec <pod-name> nslookup <service-headless-name>
7.configMap和Secret:配置应用程序
-
创建一个简单的字面量条目
k create configmap <configmap-name> --from-literal=sleep-interval=25 多条目 k create configmap <configmap-name> --from-literal=foo=bar --from-literal=bar=baz --from-literal=one=two
-
从文件内容创建configmap条目
k create configmap my-config --from-file=config-file.conf
运行上述命令时,kubectl会在当前目录下查找config-file.conf文件,并将文件内容存储在configmap中以config-file.conf为键名的条件下。当然也可以手动指定键名
k create configmap my-config --from-file=customkey=config-file.conf
多次使用
--from-file
可以增加多个文件条目 -
从文件夹创建configMap
k create configmap my-config --from-file=/path/to/dir
这种情况下,kubectl会为文件夹中的每个文件单独创建条目,仅限于那些文件名可作为合法ConfigMap键名的文件
9. Deployment:声明式的升级应用
-
滚动升级
k rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v2
-
查看部署状态
k rollout status deployment kubia
-
利用
k patch
修改单个或少量资源k patch deployment kubia -p '{"spec":{"minReadySeconds":10}}'
-
使用
kubectl set image
命令更改任何包含容器资源的镜像k set image deployment kubia nodejs=luksa/kubia:v2 执行完这个命令,kubia deployment的pod模板内的镜像会被更改为luksa/kubia:v2
-
将原有对象替换为YAML/JSON文件中定义的新对象,与apply相反,运行这个命令前要求对象必须存在,否则会打印错误
k replace -f kubia-deployment-v2.yaml
-
回滚升级deployment会回滚到上一个版本
k rollout undo deployment kubia
-
显示升级版本
k rollout history deployment kubia
-
回滚到一个特定的版本
k rollout undo deployment kubia --to-revision=1
-
暂停滚动升级
kubectl rollout pause deployment kubia
-
回复滚动升级
kubectl rollout resume deployment kubia
节点和网络安全
-
当部署pod时,可以通过
--watch
标志,每当创建,修改,删除pod时就会通知kubectl get pods --watch
-
也可以让
kubectl
打印出整个监听事件的YAML文件kubectl get pods -o yaml --watch
-
查看ServiceAccount资源
kubectl get sa/serviceaccount
-
查看挂载进pod容器内的token
进入多容器的pod时用 -c 指定容器 kubectl exec -it curl-custom-sa -c main cat /var/run..../tokens
-
创建bar命名空间中的一个角色
k create role service-reader --verb=get --verb=list --resource=services -n bar
-
创建一个
rolebinding
资源实现角色绑定到主体创建一个
rolebinding
资源,将service-reader
角色绑定到命名空间foo中的default serviceaccount
k create rolebinding test --role=service-reader --serviceaccount=foo:default -n foo
-
创建一个集群角色
k create clusterrole pv-reader --verb=get,list --resource=persistentvolumes
-
创建一个集群角色绑定
k create clusterrolebinding pv-test --clusterrole=pv-reader --serviceaccount=foo:default
-
创建一个
clusterrole
绑定podsecuritypolicy
k create clusterrole psp-privileged --verb=use --resource=podsecuritypolicies --resource-name=privileged
-
创建一个
clusterrolebinding
k create clusterrolebinding psp-test --clusterrole=psp-privileged --user=test
-
创建
PodDisruptionBudget(PDB)
资源,确保pod总有三个实例在运行k create pdb kubia-pdb --selector=app=kubia --min-available=3
高级调度
-
添加自定义污点
k taint node node1.k8s node-type=production:NoSchdule 添加一个taint,key为node-type,value为production,效果为NoSchdule
-
kubectl cp
假如有一个pod叫foo-pod,它只有一个容器,并且这个容器有个文件叫做/var/log/foo.log,那么可以使用下面的命令将这个文件传送到本地机器 kubectl cp foo-pod:/var/log/foo.log foo.log
将文件从本地传送到pod
kubectl cp localfile foo-pod:/etc/remotefile
如果有多个容器,用
-c
指定
在多个集群中使用kubectl
-
添加或修改一个集群
kubectl config set-cluster my-other-cluster --server=https://k8s.example.com:6443 --certificate-authority=path/to/the/cafile 这会添加一个API服务器地址位于https://k8s.example.com:6443,名为my-other-cluster的集群,如果指定的名称已存在,则会覆盖
-
为API服务器添加一个使用用户名和密码认证的用户
k config set-credentials foo --username=foo --password=pass 若要使用基于token的认证方式 k config set-credentials foo --token=mysecrettokenXFDJIQ1234
-
上下文中定义了哪个用户使用哪个集群,同时也可以定义kubectl应该使用的命名空间,以下命令用于创建新的上下文,并将集群与你创建的用户联系在一起
k config set-context some-context --cluster=my-other-cluster --user=foo --namespace=bar 这会创建一个名为some-context的上下文,使用my-other-cluster集群和foo用户凭据,默认命名空间为bar
-
获取当前上下文
k config current-context
-
修改命名空间
k config set-context some-context --namespace=another-namespace
-
切换上下文
kubectl config use-context my-other-context
-
列出上下文
kubectl config get-contexts
-
列出集群
kubectl config get-clusters
-
删除上下文
kubectl config delete-context my-unused-context
-
删除集群
kubectl config delete-cluster my-old-cluster
参考《Kubernetes in action》