Bootstrap

Kubernetes-操作命令

简介

kubectl是k8s操作最直接渐变的途径

基础格式:kubectl [command] [TYPE] [NAME] [flags]

command 子命令
TYPE 资源类型
NAME 资源名称
flags 命令参数

0x00 Kubeadm

/Init///
Init 初始化配置

参数
--apiserver-advertise-address(string) API服务器所公布的其正在监听的IP地址
--apiserver-bind-port(int32) API服务器绑定的端口,默认6443
--apiserver-cert-extra-sans(stringSlice) 用于API Server服务证书的可选附加主题备用名称,可以是IP和DNS名称
--certificate-key(string) 用于加密kubeadm-certs Secret中的控制平面证书的密钥
--control-plane-endpoint(string) 为控制平面指定一个稳定的IP地址或者DNS名称
--image-repository(string) 选择用于拉取控制平面镜像的容器仓库,默认k8s.gcr.io
--kubernetes-version(string) 为控制平面选择一个特定的k8s版本,默认stable-1
--cri-socket(string) 指定要连接的CRI套接字的路径
--node-name(string) 指定节点的名称
--pod-network-cidr(string) 知名Pod网络可以使用的IP地址段,如果设置了这个参数,控制平面将会为每一个节点自动分配CIDRS
--service-cidr(string) 为服务的虚拟IP另外指定IP地址段,默认 10.96.0.0/12
--service-dns-domain(string) 为服务另外指定域名,默认 cluster.local
--token(string) 用于建立控制平面节点和工作节点之间的双向通信
--token-ttl(duration) 令牌被自动删除之前的持续时间,设置为0则永不过期
--upload-certs 将控制平面证书上传到kubeadm-certs Secret

示例1:
cat << EOF > ./kubeadm-config.yaml
apiVersion: v1
kind: ClusterConfiguration
kubernetesVersion: v${K8SVERSION}
imageRespository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
    serverSubnet: "10.99.0.0/16"
    podSubnet: "${POD_SUBNET}"
    dnsDomain: "cluster.local"
EOF
# 执行完成会显示集群master节点加入以及node节点加入的提示
kubeadm init --config=kubeadm-config.yaml --upload-certs

示例2:
kubeadm init --apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_container \
--ignore-preflight-errors=all \
--kubernetes-version=v1.23.5 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=24h0m0s \
--control-plane-endpoint=192.168.2.175 \
--upload-certs

示例3:
kubeadm init phase upload-certs --upload-certs
kubeadm init phase control-plane all --config=configfile.yaml
kubeadm init phase etcd local --config=configfile.yaml
kubeadm init --skip-phase=control-phase,etcd --config=configfile.yaml

示例4:
kubeadm init phase upload-certs --upload-certs --certificate-key=SOME_VALUE --config=SOME_YAML_FILE


/Token///
Token 认证相关信息

create 创建服务器上的引导令牌
delete 删除服务器上的引导令牌
generate 生成并打印引导令牌,但不要在服务器上创建它
list 列出服务器上的引导令牌
--dry-run 是否启运运行模式
--print-join-command 打印节点加入命令

示例1:
kubeadm token create --print-join-command
kubeadm token create $(kubeadm token generate) --print-join-command -ttl=0

示例2:
kubeadm token list

示例3:
kubeadm token generate


/Config///
Config 基础环境依赖配置

images:
--config(string) kubeadm配置文件的路径
--image-repository(string) 容器仓库
--kubernetes-version(string) 选择一个特定的k8s版本
-o, --experimental-output(string) 默认值“text”,可选text|json|yaml|go-template-file|template|template|templatefile|jsonpath|jsonfile-as-json|jsonpath-file
--cri-socket(string) 要连接的CRI的套接字路径,当安装了多个CRI或者非标准CRI插槽时,才用此选项
print: 打印master初始化或者node加入时提供的配置信息
migrate: 将本地旧版本的配置对象转换为最新支持的版本,而无需变更集群中的任何内容

示例1: 指定镜像源
kubeadm config images list --image-repository mirrorgcrio --kubernetes-version=1.18.3

示例2: 指定镜像源
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=1.23.5
for i in $(kubeadm config images list --kubernetes-version=1.23.5 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers -v 5);do
    ctr -n k8s.io images pull ${i}
done

示例3: 获取构建配置
kubeadm config view # deprecated
kubectl get cm -o yaml -n kube-system kubeadm-config # 官方建议

示例4: 打印kubeadm init初始化清单,Master的初始化清单
kubeadm config print init-dafaults

示例5: 打印kubeadm join配置对象清单,即Node的初始化清单
kubeadm config print join-defaults

示例6: 将本地旧版本的配置对象转换为最新支持的版本,例如v1.23.1版本变成当前最新的v1.23.5版本
kubeadm config migrate --new-config 输出新配置文件 --old-config 读取旧初始化配置文件
kubeadm config migrate --old-config=kubeadm-config-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system: bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
    advertiseAddress: 10.10.107.225
    bindPort: 6443
nodeRegistration:
    criSocket: /run/containerd/containerd.sock
    imagePullPolicy: IfNotPresent
    name: node
    taints:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
---
apiServer:
    timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerMananger: {}
dns: {}
etcd:
    local:
        dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguretion
kubernetesVersion: v1.23.5
networking:
    dnsDomain: cluster.local
    serviceSubnet: 10.96.0.0/12
scheduler: {}


/Join///
Join 集群或者节点加入初始化

--control-plane 控制面板地址
--certificate-key 证书密钥
--discovery-token-ca-cert-hash CA证书SHA256哈希值
--token bootstarp认证token
--cri-socket Cri套接字的路径
--config kubeadm配置文件的路径

示例1: master节点加入集群控制平面
kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \
    --discovery-token-ca-cert-hash sha256:xxx
    --control-plane --certificate-key xxx

示例2: Node节点加入到集群的控制平面
kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \
    --discovery-token-ca-cert-hash sha256:xxx
    --cri-socket /run/containerd/containerd.sock

示例3: 使用配置文件配置加入的节点信息
kubeadm join --config node.yaml


/Reset///
# 重置节点操作
kubeadm reset -f


/Upgrade///
# 集群升级
kubeadm upgrade [flags]|[command]

flags:
--add-dir-header true将文件目录加入到日志信息
--log-file 日志文件
--log-file-max-size 文件最大
--rootfs 主机文件路径
--skip-headers true跳过日志标头前缀
--skip-log-headers true将在打开时避免标头
-v 日志级别

示例:
# 检查可以升级的版本
kubeadm upgrade plan
# 更新指定版本
kubeadm upgrade apply v1.18.5 --config kubeadm-config.yaml
# 不要更改任何状态,只输出将要执行的操作
kubeadm upgrade node --dry-run

command:
apply 将k8s升级到指定版本
diff 显示将应用于现有静态pod清单的差异
node 集群中节点的升级命令
plan 检查可以升级到的版本,并且验证当前集群是否可以升级,需要跳过internet检查,请传入指定的version版本

0x01 Kubectl

/自动补全///
# 自动补全 在bash中设置当前shell的自动补全,要先安装bash-completion包
source < (kubectl completion bash) 
# 添加到环境变量
echo "source <(kubectl completion bash)" >> ~/.bashrc
# zsh shell自动补全
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc
# 加入到启动配置文件中为kubectl使用一个速记别名,该别名也可以与completion一起用
cat >> ~/.bashrc << 'END'
alias k=kubectl
complete -F __start_kubectl k
END

案例:k get cs


/api-version///
kubectl api-versions # 当前可用的版本

/api-resources///
kubectl api-resoucres # 获取支持资源的完整列表

/apply///
# apply 当资源清单重新修改后采用此命令重新应用
# 1,使用kubectl apply创建该deployment
kubectl apply -f deployment.yaml # 重新应用配置
kubectl apply -f https://weiyigeek.top/k8s/deployment.yaml
# 2,执行deploment/service操作的部署命令
kubectl apply -f nginx-deployment.yaml
kubectl apply -f redis-master-service.yaml
# 3,更新k8s ConfigMap或Secret而不删除现有的
kubectl -n default create secret tls weiyigeek.top --cert=2023.weiyigeek.top.pem --key=2023.weiyigeek.top.key -o yaml --dry-run=client | kubectl apply -f -


/attach///
# 交互式操作pod
kubectl attach load-generator -c load-generator -i -t

/cluster-info///
# k8s集群信息
kubectl cluster-info

/config///
# 设置外部集群 && 删除外部集群
kubectl config set-cluster k8s-cluster --server=https://slb-vip.k8s:16443 --certificate-authority=/etc/kuberbetes/pki/ca.crt --embed-certs=true
kubectl config delete-cluster k8s-cluster

# 设置上下文 && 删除上下文
kubectl config set-context devops-ctx --cluster=k8s-cluster --user=devopsuser --namespace=devops
kubctl config delete-context devops-ctx

# 设置用户 && 删除用户
kubectl config set-credentials devopsuser --client-key=/etc/kubernetes/pki/user/devopsuser-key.pem --client-certificate=/etc/kubernetes/pki/user/devopsuser-key.pem --user=devopsuser --embed-certs=true
kubectl config delete-user devopsuser

# 获取全局上下文
kubectl config get-context

# 获取当前上下文
kubectl config current-context

# 切换指定上下文
kubectl config use-context devops-ctx



/cp///
# 复制Pod中的文件到指定目录
kubectl cp weiyigeek/users-0:/usr/local/tomcat/logs /tmp/logs
kubectl cp devops/test-28-1vw8p-vlr29-fxvqs:/home/jenkins/.ssh /tmp


/create///
# 根据对应的清单创建Pod
kubectl create -f nginx-pod.yaml
# 根据命令生成一个deployment清单
kubectl create deployment javs-demo --image=WeiyiGeek/java-demo --dry-run -o yaml > deploy.yaml


/cordon///
# 节点限制加入资源
kubectl cordon node-1 # 禁止新建立的Pod在该节点上运行


/describe///
# 显示有关资源的详细信息
# 格式:kubectl describe 资源类型 资源名称
# 1,查看名称为nginx-deployment-xxx的Pod的信息
kubectl describe pod nginx-deployment-xxx
# 2,查看deployment信息
kubectl describe deployment nginx-deployment
# 3,查看节点信息
kubectl describe node master-03


/delete///
# 删除节点和资源
# 可以删除相关节点和资源对象Pods,Svc,Nodes,Namespace,ConfigMap,Deployment,Rs,Rc,sts
# 格式:kubectl delete [TYPE] Flags
kubectl delete node k8s-master-1
kubectl -n kube-system delete Pods calico-xxx
# 删除容器组
kubectl delete pods cloudagile-mariadb-0 -n intelligence-data-lab -grace-period=0 --force # 强制删除特定pods
kubectl get pods --field-selector=status.phase=Failed --all-namespace | awk `{system("kubectl delete pod "$2" -n " $1)}` # 删除集群中失败的Pods
kubectl get pods --all-namespaces | grep Terminating||grep -w "0/1" | awk `system("kubectl delete pod "$2" -n "$1" --grace-period=0 --force")`


/drain///
# 节点组件清理
# 示例1,强制删除节点本地数据以及运行的容器
kubectl drain master-02 --delete-local-data --force --ignore-daemonsets
kubectl get nodes master-02
# 示例2,强制删除处于terminal状态或者异常状态的Pod,等待时间为0
kubectl delete pod -n ingress-nginx --force --grace-period=0 ingress-nginx-controller-xxx


/exec///
# 在Pod中的容器环境内执行命令
# 格式:kubectl exec PodName 操作命令 | kubectl exec -n 名称空间 -it Pod名称 -c 容器名称 -- /bin/sh
# 示例,在名为nginx-pod-xxxx的Pod中运行bash
kubectl exec -it nginx-deployment-xxx /bin/bash
# 示例,进入Pod多个容器中的一个,例如进入名为xxx的Pod的Blog容器
kubectl exec -n test -it xxx -c Blog -- /bin/bash


/expose///
# 将资源公开保留为新的SVC服务
# 按名称查找deployment,service,replica set,replication controller or pod等资源,并将其公开为新的k8s服务
# 格式:kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
# 参数列表
--dry-run[=false] 如果设置为true,试运行操作,并不是真执行
--external-ip="" 挂载不由k8s管理的可访问节点
--filename 要公开服务的资源文件
--generator="service/v2" 根据SVC API模版生成
--labels=“” 创建服务指定的标签
--load-balancer-ip="" 负载均衡ip,没指定,k8s将默认赋值
--name="" 新创建的对象名称
--port="" SVC端口
--target-port="" 代理端口
--protocol="" 协议
--type="" 服务类型,范围:ClusterIP, NodePort,LoadBalancer, ExternalName, Default
# 示例: 为nginx部署创建一个服务名为nginx-external的服务,该部署服务于80端口,并且指向Pod容器的8080端口
kubectl expose deployment nginx --name nginx-external --type=ClusterIP --port=80 --target-port=8000
# 示例: 为nginx-web服务创建一个别名服务nginx-web-external,其类型为NodePort,注意此处随机端口
kubectl expose service -n devtest nginx-web --name nginx-web-external --type=NodePort --port=80 --target-port=80
# 查看执行结果
kubectl get svc -n devtest nginx-web-external



/get///
# 显示k8s相关资源对象信息 Pod,Svc,Nodes,NameSpace,ConfigMap,Deployment,Rs,Rc,sts
# 语法:kubectl get 资源类型
# 参数
-l 获取相关labels标签列表
-o 格式化输出
--namespace 指定命名空间的查找
--template 用go-template格式化
# 示例
kubectl get deployments
kubectl get pods # 取 default命名空间的
kubectl get pods --all-namespace
kubectl get pods -l app=nginx # 取指定labels的
kubectl get pods -n kube-system -l "app.kubernetes.io/name=kubernetes-dashhoard,app.kubernetes.io/instance=kubernetes-dashboard" -o jsonpath="{.item[0].metedata.name}" # 过滤获取
kubectl get pods --namespace kube-system -o jsonpath="{..image}" # 只输出镜像名字的
kubectl get pods --all-namespace -o=jsonpath="{..image}" -l app=redis
kubectl get pods --all-namespace -o jsonpath="{..image}" | tr -s '[[:space]]' '\n' | sort | uniq -c # 将空格替换为新的行,并对结果进行排序,然后计数
kubectl get pod -n weiyigeek -l ref=info-student -o jsonpath="{.items[*].status.podIP}" | tr -s '[[:space]]' '\n' > ip.txt # 解读ip
for x in $(cat ip.txt); do echo -n "$x -";curl -v http://${x}:8080;echo "";done
# 用Pod中image字段的绝对路径来查找容器中的镜像名称,可以规避image重复出现的情况
kubectl get pods --all-namespace -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | uniq -c | sort -r
kubectl get pods -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | uniq -c | sort -r
# 如果通过名字查找Pod,由于返回结果只有一个Pod,此时,.items[*]这一部分应从jsonpath中移除
kubectl get pods redis-master-deployment-xxx -o jsonpath="{.spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | uniq -c | sort -c
# 按pod查找输出结果可以通过range遍历
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{","}{end}{end}' | sort
kubectl get pods --all-namespace -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}}{{end}}{{end}}"
# 查看node资源类型
kubectl get nodes
kubectl get nodes -o wide
# 查看Deployment
kubectl get deployments -A
kubectl get deployments -n kube-system
# 查看Service
kubectl get services -o wide
kubectl get svc -o wide
# 查看配置文件信息
kubectl get cm kubeadm-config -n kube-system -o yaml
# 查看选举信息
kubectl get ep kube-controller-manager -n kube-system -o yaml
# 查看副本
kubectl get rs


/logs///
# 输出Pod日志
# 参数
-c, --container=""
-f, --follow[=false] 是否持续输出日志
    --interactive[=true] 如果为true,当需要时提示用户进行输入
    --limit-bytes=0 输出日志的最大字节数
-p, --previous[=false] 如果为true,输出Pod中曾运行过,但是目前已终止的容器的日志
    --since=0 仅返回相对时间范围
    --since-time="" 返回指定时间之后的格式
    --tail=-1 要显示的最新的日志条数
    --timestamps[=false] 在日志中包含时间戳
# 示例
kubectl logs -f nginx-deployment-xxx
# 输出pod-ruby中已经停止的容器web-1的日志
kubectl logs -p -c ruby web-1
# 持续输出ruby容器的web-1的日志
kubectl logs -f -c ruby web-1
# 输出nginx前20条日志
kubectl logs --tail=20 nginx
# 输出nginx中最近一小时的日志
kubectl logs --since=1h nginx


/run///
# 运行一个Pod应用
# 示例
kubectl run helloworld --image=hello-world # 自主建立Pod


/replace///
# 用文件名或者stdin替换资源
# 参数
-f, --filename=[]
--force=false 强制
--wait=false 如果为真,等待资源消失后再返回
#示例:
kubectl replace -f ./pod.json # 用json文件替换现有资源
cat pod.json | kubectl replace -f - # 根据传递给stdin的json替换一个pod
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - # 将容器镜像版本升级到v4
kubectl replace --force -f ./pod.json # 强制替换


/port-forward///
# 使用资源的名称来进行本地端口转发
# 将一个或者本地端口转发到pod,此命令要求节点安装socat,使用资源类型/名称(如deployment/mydeployment)来选择pod,如果省略资源类型默认为pod
# 语法:
kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]
# 参数
--address=[localhost] # 要监听的地址,逗号分隔
--pod-running-timeout=1m0s # 等待的时间长度,如5s,2m,3h
# 示例:
kubectl port-forword pod/mypod :5000 # 在本地的随机端口上侦听,转发到pod的5000
kubectl port-forword service/myservice 8443:https # 本地侦听端口8443转发到服务选择的pod中名为https的服务端口的targetPORT
kubectl port-forword --address 127.0.0.1,10.10.107.191 pod/redis-master-xxx 7000:6379 # 映射redis-master Pod的6379到127.0.0.1,10.10.107.191 的7000


/label///
# 标签信息,通过标签设置来控制Pod于节点的亲和性
# 节点角色名称设置
kubectl label node weiyigeek-23 node-role.kubernetes.io/work=test
# 取消节点角色名称
kubectl label node weiyigeek-23 node-role.kubernetes.io/work


/top///
# Linux top
kubectl top node


/scale///
# 动态更新副本数量
kubectl -n app scale statefulset/xk-student --replicas=0


/set///
# 配置应用程序资源
kubectl set SUBCOMMAND [options]
SUBCOMMAND: 
env 更新模版环境变量
image 更新模版镜像地址
resources 在对象的pod templates上更新资源的requests/limits
selector 设置resource的selector
serviceaccount 更新资源服务账户
subject 更新角色绑定或集群角色绑定中的用户,组或者服务账户
# 案例
kubectl set image deployment/nginx busybox=busybox:latest nginx=nginx:1.21.0 # 设置deployment控制器管理的nginx资源,将nginx镜像换成1.21.0
kubectl set image deployments,rc nginx=nginx:1.19.1 --all # 将所有deployment和rc的nginx容器镜像更新为1.19
kubectl set image daemonset abc *=nginx:1.9.1 # 将守护进程的abc所有容器的镜像更新为nginx:1.9


/wait///
# 等待一个或者多个资源的特定条件
# 该命令会占用多个资源,通过使用-for标志等待在每个给定对象的状态字段中看到指定的条件资源,并将向标准输出一条成功消息,指示何时满足指定条件,同时可以用-o更改输出目标
# 示例
kubectl wait --namespace ingress-nginx --for=condition=ready pod --selector=app.kubernetes.io/component=controller --timeout=120s # 等待ingress的相关资源Pod状态为Ready,使用标签选择器,超时时间为120s
kubectl wait --for=condition=Ready pod/busbox1 # 等待pod busybox包含类型为Ready的状态条件
kubectl delete pod/busybox
kubectl wait --for=delete pod/busybox --timeout=60s # 发出删除命令后,等待pod busybox被删除,超时时间60s
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/busybox # 等待busybox包含正在运行的状态阶段


/rollout///
# 滚动更新
kubectl rollout status deployment neginx-deployment # 查看当前更新状态
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment # 查看可回滚的历史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2 # 回退到某个版本
kubectl rollout pause deployment/nginx-deployment # 暂停deployment的更新

后续将继续补全

;