dry-run的使用方式:
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=server
kubectl run nginx --image=nginx --dry-run=client -o yaml
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client
k create service nodeport my-svc --tcp=4396:4396 -o yaml --dry-run=client
k create deploy my-deploy --image=nginx -o yaml --dry-run=client
k create ingress my-ingress --rule="foo.com/*=svc:8080,tls=my-cert" --class=default --default-backend=defaultsvc:http -o yaml --dry-run=client
k create svc nodeport my-svc --tcp=8080:43960 --dry-run=client -o yaml | k set selector --local -f - 'environment=qa' -o yaml
k create svc nodeport my-svc --tcp=8080:43960 --dry-run=client -o yaml | k set selector --local -f - 'environment=qa' -o yaml | k create/apply -f -
kubectl diff - 查看集群建议更新的差异。
使用方式:
kubectl diff -f pod.json
# 或者
cat service.yaml | kubectl diff -f -
先创建一个php pod,再修改pod的副本数。
k diff -f php-apache.yaml
更新一个或多个资源上的annotations。
kubectl annotate pod php-apache-6cd4b65f7b-94bsb description='test annotations'
kubectl annotate pod php-apache-6cd4b65f7b-94bsb --overwrite description='annotations'
k get po php-apache-6cd4b65f7b-94bsb -o yaml | grep resourceVersion
kubectl annotate pod php-apache-6cd4b65f7b-94bsb --overwrite description='only annotations' --resource-version=91114854
kubectl annotate pod php-apache-6cd4b65f7b-94bsb --overwrite description='only annotations' --resource-version=91114853
可以看到在resourceVersion有误的时候更新报错要在最新版本上运行。
kubectl annotate pod php-apache-6cd4b65f7b-94bsb description-
在对pod进行排错时,除了查看pod logs和describe方式之外,传统的解决方式是在业务pod基础镜像中提前安装好procps(vmstat,pmap,pidof)、net-tools(netstat,telnet)、tcpdump、vim等工具。但这样既不符合最小化镜像原则,又徒增Pod安全漏洞风险。
这时就可以使用kubectl debug,它通过启动一个可交互容器,并将其加入到目标业务容器的pid, network, user 以及 ipc namespace 中,然后我们就可以在新容器中直接用 netstat, tcpdump 这些熟悉的工具来解决问题了。而业务容器可以保持最小化, 不需要预装任何额外的排障工具。
k debug nginx-deployment-6799fc88d8-vxx6l --image=busybox
# 这里报错
Defaulting debug container name to debugger-2bx5z.
error: ephemeral containers are disabled for this cluster (error from server: "the server could not find the requested resource").
修改kube-apiserver配置文件,开启临时容器功能,添加**–feature-gates=EphemeralContainers=true**
cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
k apply -f nginx.yaml
k debug -it nginx-deployment-6799fc88d8-vxx6l --image=busybox --share-processes --copy-to=nginx-debug --container=nginx-container-debug
通过复制pod和进程共享,可以看到pod中的进程文件等。
可以看打此时调试pod是有2个容器的包括临时容器
查看pod中是否允许进程共享
k get po nginx-debug -o json | grep shareProcessNamespace
k get po nginx-debug -o json | jq .spec.shareProcessNamespace
kubectl run --image=busybox myapp -- false
kubectl debug myapp -it --copy-to=myapp-debug -- sh
# 报错需要指定存在的容器或者新的镜像
error: you must specify an existing container or a new image when specifying args.
kubectl debug myapp -it --copy-to=myapp-debug --container=myapp -- sh
有些时候可能需要修改异常pod的镜像为调试镜像。
k run myapp --image=busybox --restart=Never -- tail -f /dev/null
k get po
k debug myapp -it --copy-to=myapp-debug --set-image=myapp=centos --container=myapp -- sh
kubectl debug 允许通过创建 Pod 来调试节点,该 Pod 将在指定节点上运行,节点的根文件系统安装在 /root 目录中。我们甚至可以用 chroot 访问主机二进制文件,这本质上充当了节点的 SSH 连接。
k get node
kubectl debug node/wghdr -it --image=centos
可以看到目录已经切换了。
cd /etc
chroot /host
cd /etc/kubernetes/manifests/
ls
如果一个pod已经在运行,这时需要对pod属性进行修改,又不想删除pod,或不方便通过replace的方式进行更新,这时就可以使用patch命令。
kubectl patch \
(-f FILENAME | TYPE NAME) \
[-p PATCH|--patch-file FILE] \
[options]
kubectl patch -f node.json -p '{"spec":{"unschedulable":true}}'
kubectl patch deployment nginx --patch "$(cat patch-file-containers.yaml)"
kubectl patch deployment nginx --patch-file patch-file-containers.yaml
k patch po myapp -p '{"spec":{"containers":[{"name":"myapp","image":"busybox:latest"}]}}' --dry-run=client -o yaml
pod/myapp patched
k patch pod myapp --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"busybox:latest"}]' --dry-run=server -o yaml
# 上面两种方法等价
k patch svc nginx --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"},{"op":"add","path":"/spec/ports/0/nodePort","value":30000}]'
k patch svc nginx --type='json' -p '[{"op":"remove","path":"/spec/ports/0/nodePort"},{"op":"replace","path":"/spec/type","value":"ClusterIP"}]'
–type=‘strategic’: The type of patch being provided; one of [json merge strategic]
{
"txt": {
"name": "wghdr",
"age": 18,
"gender": "male",
}
}
需要修改成:
{
"txt": {
"name": "wghdr",
"age": 26,
}
}
如果是replace则json变为:符合预期
{
"txt": {
"name": "wghdr",
"age": 26,
}
}
如果是merge则json变为:不符合预期。有变更的字段发生进行更新,没有变化的字段则进行合并,并不会删除。
{
"txt": {
"name": "wghdr",
"age": 26,
"gender": "male",
}
}
[
{
"op" : "remove/add/replace",
"path" : "" ,
"value" : ""
}
]
在 patch 的时候,有一些 key 比较特殊,会包含波浪线和斜杠,当 --patch 参数是 json 格式时,path 里的斜杠就会与 key 冲突,此时可以将 波浪线和斜杠 替换成如下转义字符
~ (波浪线)对应的是~0
/ (斜杠)对应的是:~1
根据文件或者标准输入替换资源。
kubectl replace -f ./pod.json
cat pod.json | kubectl replace -f -
k get po nginx-75f4d489b4-mhrbj -o yaml | sed 's/\(image: docker.io\/bitnami\/nginx\):.*$/\1:v4/' | kubectl replace -f - --dry-run=client -o yaml | grep image
kubectl set env deploy nginx ENV=prod --dry-run=client -o yaml
kubectl set image deployment/nginx nginx=nginx:latest
# 设置Requests和Limits
kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi
# 删除限制
kubectl set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0
kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client | kubectl set selector --local -f - 'environment=qa' -o yaml
k get deploy nginx -o yaml | grep serviceAccountName
k set serviceaccount deployment nginx serviceaccount1 --dry-run=client -o yaml | grep serviceAccountName
kubectl set subject clusterrolebinding admin --serviceaccount=namespace:serviceaccount1
kubectl set subject rolebinding admin --user=user1 --user=user2 --group=group1
kubectl create rolebinding admin --role=admin --user=admin -o yaml --dry-run=client | kubectl set subject --local -f - --user=foo -o yaml
三者在让node不可调度时,node上的pod处理各有不同。
kubectl uncordon node
kubectl drain foo -f
驱逐node,但是给pod900s的宽限时间。
kubectl drain foo --grace-period=900
用来修改kubeconfig文件。
kubectl config rename-context old-name new-name
kubectl config set PROPERTY_NAME PROPERTY_VALUE
# PROPERTY_NAME是一个点分隔的名称,其中每个标记代表一个属性名称或一个映射键。映射键不能包含点。
# PROPERTY_VALUE是您想要设置的新值。二进制字段(如'certificate-authority-data')需要base64编码的字符串,除非使用——set-raw-bytes参数。
# 设置kubeconfig中集群地址为https://1.2.3.4
kubectl config set clusters.my-cluster.server https://1.2.3.4
# 设置kubeconfig中集群token为cert_data_here证书的base64编码
kubectl config set clusters.my-cluster.certificate-authority-data $(echo "cert_data_here" | base64 -i -)
# 使用--set-raw-bytes=true
kubectl config set users.cluster-admin.client-key-data cert_data_here --set-raw-bytes=true
kubectl config set-cluster NAME [--server=server] [--certificate-authority=path/to/certificate/authority] [--insecure-skip-tls-verify=true] [--tls-server-name=example.com]
kubectl config set-context [NAME | --current] [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace]
kubectl config set-credentials
--client-certificate=certfile --client-key=keyfile
--token=bearer_token
--username=basic_user --password=basic_password
kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true(插入证书到kubeconfig)
kubectl config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif
# 不包含证书
kubectl config view
# 包含证书
kubectl config view --raw
kubectl explain <type>.<fieldName>[.<fieldName>] --recursive(去掉解释)