[TOC]

0x00 前言简述

描述: 学习 Kubernetes 最重要的是其基础的理论概念以及实践操作, 而实际操作又必不可少的是k8s相关的命令,所以为了方便自己以及读者的查阅,将自己在学习过程中所遇的命令进行一个简单的记录;

0x01 Kubeadm 命令 - 用来初始化集群的指令

描述:该命令是安装K8s后的基础命令可以进行K8s主或者从节点的初始化,以及节点加入管理;

init - 初始化配置相关

描述:该命令用户初始化节点设置master节点的控制面板以及网络相关的设置;

命令参数

  • phase : 该子命令分阶段创建控制平面节点。

参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--apiserver-advertise-address string : API 服务器所公布的其正在监听的 IP 地址。
--apiserver-bind-port int32 : API 服务器绑定的端口, 默认值:6443
--apiserver-cert-extra-sans stringSlice : 用于 API Server 服务证书的可选附加主题备用名称(SAN),可以是 IP 地址和 DNS 名称。
--certificate-key string :用于加密 kubeadm-certs Secret 中的控制平面证书的密钥。

--control-plane-endpoint string : 为控制平面指定一个稳定的 IP 地址或 DNS 名称。
--image-repository string :选择用于拉取控制平面镜像的容器仓库,默认值:"k8s.gcr.io", 国内一般要设置镜像源。
--kubernetes-version string :为控制平面选择一个特定的 Kubernetes 版本,默认值:"stable-1"
--cri-socket string :指定要连接的 CRI 套接字的路径。

--node-name string : 指定节点的名称。

--pod-network-cidr string : 指明 pod 网络可以使用的 IP 地址段,如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。(flannel-10.244.0.0/16)
--service-cidr string : 为服务的虚拟 IP 地址另外指定 IP 地址段, 默认值:"10.96.0.0/12"
--service-dns-domain string :为服务另外指定域名,默认值:"cluster.local"

--token string :用于建立控制平面节点与工作节点间的双向通信,格式为`[a-z0-9]{6}\.[a-z0-9]{16}`-示例`abcdef.0123456789abcdef`
--token-ttl duration :令牌被自动删除之前的持续时间(例如1s、2m、3h),如果设置为 '0',则令牌将永不过期
--upload-certs : 将控制平面证书上传到 kubeadm-certs Secret。


简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 示例1.Master节点初始化采用指定yaml配置文件进行初始化参数的传入,下述配置清单可由 kubeadm config print init-defaults 生成
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${K8SVERSION}
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.99.0.0/16"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF
# 执行完成会显示集群master节点加入以及Node节点加入的命令行(有效期24个小时)
kubeadm init --config=kubeadm-config.yaml --upload-certs

# 示例2.Master节点初始可以直接采用参数进行指定
kubeadm init --apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_containers \
--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.获得加入控制平台的证书 (使用此命令调用init工作流的单个阶段并且上传证书到kubeadm-certs)
sudo kubeadm init phase upload-certs --upload-certs
sudo kubeadm init phase control-plane all --config=configfile.yaml
sudo kubeadm init phase etcd local --config=configfile.yaml
# 你现在可以修改控制平面和 etcd 清单文件
sudo kubeadm init --skip-phases=control-plane,etcd --config=configfile.yaml

# 示例4.以下阶段命令可用于证书到期后重新上传证书
# 如果未将参数 --certificate-key 传递给 kubeadm init 和 kubeadm init phase upload-certs, 则会自动生成一个新密钥。
kubeadm init phase upload-certs --upload-certs --certificate-key=SOME_VALUE --config=SOME_YAML_FILE


token - 生成认证相关信息

命令参数:

1
2
3
4
5
6
7
8
9
# Available Commands:
create 创建服务器上的引导令牌
delete 删除服务器上的引导令牌
generate 生成并打印引导令牌,但不要在服务器上创建它
list 列出服务器上的引导令牌

# 常用子命令
--dry-run : 是否启用干运行模式(模拟)
--print-join-command :create - 打印节点加入命令

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
# 示例1.节点初始化命令行生成(有效期两个小时,token有效期24h)
kubeadm token create --print-join-command
kubeadm token create $(kubeadm token generate) --print-join-command --ttl=0 #方式2

# 示例2.查看生成的token有效期(通常24H)
kubeadm token list
# TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
# 2af75y.5fio8knxu9e2ygvz 23h 2020-06-25T09:28:19+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token

# 示例3.生成一个令牌
kubeadm token generate
# w9tc5q.keah29ljmqonx00n


config - 基础环境依赖配置

描述: 该命令可以显示或者打印集群初始化相关配置信息, 其次可以进行版本迁移,最后用于列举并拉取 kubeadm 所需的镜像。

命令参数:

  • images [list|pull] : 查看和拉取kubeadm初始化所需镜像。
1
2
3
4
5
6
7
# 关键参数
--config string : kubeadm 配置文件的路径。
--image-repository string : 选择要从中拉取控制平面镜像的容器仓库
--kubernetes-version string : 选择一个特定的 Kubernetes 版本
-o, --experimental-output string 默认值:"text", 可选 text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file
# pull
--cri-socket string : 要连接的 CRI 套接字的路径, 仅当安装了多个CRI或具有非标准CRI插槽时,才使用此选项.
  • print : 打印集群Master初始化或者Node节点加入所提供的配置信息。
  • migrate : 允许将本地旧版本的配置对象转换为最新支持的版本,而无需变更集群中的任何内容。


基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 示例1.指定kubernetes版本查看依赖镜像,并指定仓库源;
kubeadm config images list --image-repository mirrorgcrio --kubernetes-version=1.18.3
# mirrorgcrio/kube-apiserver:v1.18.3
.....
# mirrorgcrio/coredns:1.6.7

# 示例2.拉取指定版本以及镜像仓库(由于国内环境无法访问 k8s.gcr.io,此处最新推荐设置为阿里云镜像 )
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
$ kubectl get cm -o yaml -n kube-system kubeadm-config # 官方建议
# Command "view" is deprecated, This command is deprecated and will be removed in a future release, please use 'kubectl get cm -o yaml -n kube-system kubeadm-config' to get the kubeadm config directly.
# apiServer:
# extraArgs:
# authorization-mode: Node,RBAC
# timeoutForControlPlane: 4m0s
# apiVersion: kubeadm.k8s.io/v1beta2
# certificatesDir: /etc/kubernetes/pki
# clusterName: kubernetes
# controlPlaneEndpoint: weiyigeek.k8s:6443
# controllerManager: {}
# dns:
# type: CoreDNS
# etcd:
# local:
# dataDir: /var/lib/etcd
# imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# kind: ClusterConfiguration
# kubernetesVersion: v1.19.3
# networking:
# dnsDomain: cluster.local
# podSubnet: 10.244.0.0/16
# serviceSubnet: 10.96.0.0/12
# scheduler: {}

# 实例4.打印用于 'kubeadm init' 的默认 init 配置对象资源清单(即集群Master节点初始化清单)
kubeadm config print init-defaults

# 实例5.打印用于 'kubeadm join' 的默认 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.yml
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
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.23.5
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}


join - 集群或者节点加入初始化

命令参数:

1
2
3
4
5
6
--control-plane : 控制面板地址
--certificate-key : 证书密钥
--discovery-token-ca-cert-hash : CA证书SHA256哈希值
--token : bootstrap 认证 token
--cri-socket string : CRI套接字的路径, 当系统中存在非标准或者多个CRI套接字时使用该选项。
--config string :kubeadm 配置文件的路径


基础使用:

1
2
3
4
5
6
7
8
9
10
11
12
# 示例1.Master主节点加入到集群控制平面
kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \
--discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951 \
--control-plane --certificate-key 28b178f04afae3770aa92add0206650b2359dd61424f127a6d44142dd15a280d

# 示例2.Node工作节点的加入到集群控制平面 , 并指定CRI的套接字为 /run/containerd/containerd.sock。
kubeadm join apiserver.test:6443 --token hzlzrr.uwuegx4locpu36oc \
--discovery-token-ca-cert-hash sha256:4cbe428cb3503277be9fbcf3a99de82a97397a624dd94d4270c4eed1b861f951 \
--cri-socket /run/containerd/containerd.sock

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


reset - 节点重置操作

基础实例:

1
2
# 重置Workers节点操作
kubeadm reset -f


upgrade - 节点更新操作

描述: 使用此命令将集群顺利升级到新版本

基础语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Usage:
kubeadm upgrade [flags]
kubeadm upgrade [command]

# Commands:
apply:将Kubernetes集群升级到指定的版本
diff:显示将应用于现有静态pod清单的差异。另请参见: `kubeadm upgrade apply --dry-run`
node:群集中节点的升级命令
plan:检查可升级到的版本,并验证当前集群是否可升级。要跳过internet检查,请传入可选的[version]参数

# Flags:
--add-dir-header If true, adds the file directory to the header of the log messages
--log-file string If non-empty, use this log file
--log-file-max-size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800)
--rootfs string [EXPERIMENTAL] The path to the 'real' host root filesystem.
--skip-headers If true, avoid header prefixes in the log messages
--skip-log-headers If true, avoid headers when opening log files
-v, --v Level number for the log level verbosity


基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 0.查看检查可升级到的版本
kubeadm upgrade plan

# 1.更新集群为指定版本v1.18.5
kubeadm upgrade apply v1.18.5 --config kubeadm-config.yaml

# 2.不要更改任何状态,只输出将要执行的操作。
kubeadm upgrade node --dry-run
# apiVersion: v1
# data:
# ClusterConfiguration: |
# apiServer:
# certSANs:
# - 192.168.12.226
# extraArgs:
# authorization-mode: Node,RBAC
# .....................................


0x02 Kubelet 命令 - 在集群中的每个节点上用来启动 pod 和容器等。


0x03 Kubectl 命令 - 用来与集群通信的命令行工具

描述:该命令实际上是操作 Kubernetes 对象(创建、修改、删除)的方法;
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

Kubectl 自动补全:

1
2
3
4
5
6
7
8
9
10
11
12
# 自动补全
source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包
# 在您的 bash shell 中永久的添加自动补全
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

使用案例:

1
2
3
4
5
6
7
[root@master-01 ~]$ k get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}


api-versions - 当前可用集群支持的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ kubectl api-versions
# admissionregistration.k8s.io/v1
# admissionregistration.k8s.io/v1beta1
# apiextensions.k8s.io/v1
# apiextensions.k8s.io/v1beta1
# apiregistration.k8s.io/v1
# apiregistration.k8s.io/v1beta1
# apps/v1
# 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
# crd.projectcalico.org/v1
# discovery.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

api-resources - 获得支持资源的完整列表

描述:在必须指定要描述的资源类型的时候使用,注意可以看出资源对象是否支持名称空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
limitranges limits true LimitRange
namespaces ns false Namespace
nodes no false Node
persistentvolumeclaims pvc true PersistentVolumeClaim
persistentvolumes pv false PersistentVolume
pods po true Pod
podtemplates true PodTemplate
replicationcontrollers rc true ReplicationController
resourcequotas quota true ResourceQuota
secrets true Secret
serviceaccounts sa true ServiceAccount
services svc true Service
mutatingwebhookconfigurations admissionregistration.k8s.io false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io false CustomResourceDefinition
apiservices apiregistration.k8s.io false APIService
controllerrevisions apps true ControllerRevision
daemonsets ds apps true DaemonSet
deployments deploy apps true Deployment
replicasets rs apps true ReplicaSet
statefulsets sts apps true StatefulSet
tokenreviews authentication.k8s.io false TokenReview
localsubjectaccessreviews authorization.k8s.io true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling true HorizontalPodAutoscaler
cronjobs cj batch true CronJob
jobs batch true Job
certificatesigningrequests csr certificates.k8s.io false CertificateSigningRequest
leases coordination.k8s.io true Lease
bgpconfigurations crd.projectcalico.org false BGPConfiguration
bgppeers crd.projectcalico.org false BGPPeer
blockaffinities crd.projectcalico.org false BlockAffinity
clusterinformations crd.projectcalico.org false ClusterInformation
felixconfigurations crd.projectcalico.org false FelixConfiguration
globalnetworkpolicies crd.projectcalico.org false GlobalNetworkPolicy
globalnetworksets crd.projectcalico.org false GlobalNetworkSet
hostendpoints crd.projectcalico.org false HostEndpoint
ipamblocks crd.projectcalico.org false IPAMBlock
ipamconfigs crd.projectcalico.org false IPAMConfig
ipamhandles crd.projectcalico.org false IPAMHandle
ippools crd.projectcalico.org false IPPool
networkpolicies crd.projectcalico.org true NetworkPolicy
networksets crd.projectcalico.org true NetworkSet
endpointslices discovery.k8s.io true EndpointSlice
events ev events.k8s.io true Event
ingresses ing extensions true Ingress
ingressclasses networking.k8s.io false IngressClass
ingresses ing networking.k8s.io true Ingress
networkpolicies netpol networking.k8s.io true NetworkPolicy
runtimeclasses node.k8s.io false RuntimeClass
poddisruptionbudgets pdb policy true PodDisruptionBudget
podsecuritypolicies psp policy false PodSecurityPolicy
clusterrolebindings rbac.authorization.k8s.io false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io false ClusterRole
rolebindings rbac.authorization.k8s.io true RoleBinding
roles rbac.authorization.k8s.io true Role
priorityclasses pc scheduling.k8s.io false PriorityClass
csidrivers storage.k8s.io false CSIDriver
csinodes storage.k8s.io false CSINode
storageclasses sc storage.k8s.io false StorageClass
volumeattachments storage.k8s.io false VolumeAttachment


apply - 当资源清单重新修改后采用此命令重新应用

基础示例

1
2
3
4
5
6
7
8
9
10
# 1.使用 kube apply 命令可以创建该 .yaml 文件中的 Deployment 对象
kubectl apply -f deployment.yaml
kubectl apply -f https://weiyigeek.top/k8s/deployment.yaml

# 2.执行deployment/services操作的部署命令
kubectl apply -f nginx-deployment.yaml
# deployment.apps/nginx-deployment created

kubectl apply -f redis-master-service.yaml
# service/redis-master-service created


attach - 进入pod容器中进行交互式运行

1
2
3
4
# 示例1.在pod运行时使用命令以下命令继续在Pod子容器中进行交互式运行
~$ kubectl attach load-generator -c load-generator -i -t
If you don't see a command prompt, try pressing enter.
/ #


cluster-info - K8s 集群信息

示例1.集群相关信息包括 API-Server 地址 以及 KubeDNS 相关信息

1
2
3
~$  kubectl cluster-info
# Kubernetes master is running at https://weiyigeek-lb-vip.k8s:16443
# KubeDNS is running at https://weiyigeek-lb-vip.k8s:16443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

config - 集群上下文以及用户配置

常规示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 设置外部集群 && 删除外部集群
kubectl config set-cluster k8s-cluster- --server=https://slb-vip.k8s:16443 --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true
# Cluster "k8s-cluster" set.
kubectl config delete-cluster k8s-cluster
# deleted cluster k8s-cluster from /root/.kube/config

# 设置上下文 && 删除上下文
kubectl config set-context devops-ctx --cluster=k8s-cluster --user=devopsuser --namespace=devops
# Context "devops-ctx " created.
kubectl config delete-context devops-ctx
# deleted context devops-ctx from /root/.kube/config

# 设置用户 && 删除用户
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
# User "devopsuser" set.
kubectl config delete-user devopsuser
# deleted user devopsuser from /root/.kube/config

# 获取全局上下文
kubectl config get-contexts
# 获取当前上下文
kubectl config current-context
# 切换指定上下文
kubectl config use-context devops-ctx


cp - 复制Pod中的文件到指定目录之中

示例1.从Pod中复制文件到本地

1
2
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

基础示例

1
2
3
4
5
# 示例1.资源清单来创建 pod
kubectl create -f nginx_pod.yaml

# 示例2.根据命令行生成一个 `deployment` 资源清单
kubectl create deployment java-demo --image=WeiyiGeek/java-demo --dry-run -o yaml > deploy.yaml


cordon - 节点限制加入资源

1
2
3
4
# kubectl cordon [节点名称]
# (1) 禁止新建立的Pod在该节点上运行
kubectl cordon node-1
node/node-1 cordoned


describe - 显示有关资源的详细信息

语法参数:

1
kubectl describe 资源类型 资源名称

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#1.查看名称为nginx-deployment-674ff86d-btmt4的Pod的信息
kubectl describe pod nginx-deployment-674ff86d-btmt4
# Name: nginx-deployment-674ff86d-btmt4
# Namespace: default
# Priority: 0
# Node: node/10.10.107.192
# Start Time: Thu, 07 May 2020 14:12:18 +0800
# Labels: app=nginx
# pod-template-hash=674ff86d
# Annotations: cni.projectcalico.org/podIP: 10.100.167.129/32
# cni.projectcalico.org/podIPs: 10.100.167.129/32
# Status: Running
# IP: 10.100.167.129
# IPs:
# IP: 10.100.167.129
# Controlled By: ReplicaSet/nginx-deployment-674ff86d


#2.查看名称为nginx-deployment的Deployment的信息
kubectl describe deployment nginx-deployment
# Name: nginx-deployment
# Namespace: default
# CreationTimestamp: Thu, 07 May 2020 14:12:18 +0800
# Labels: app=nginx
# Annotations: deployment.kubernetes.io/revision: 1
# Selector: app=nginx
# Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
# ...
# Conditions:
# Type Status Reason
# ---- ------ ------
# Available True MinimumReplicasAvailable
# Progressing True NewReplicaSetAvailable
# OldReplicaSets: <none>
# NewReplicaSet: nginx-deployment-674ff86d (1/1 replicas created)
# Events: <none>


#3.查看节点各项信息
kubectl describe node master-03
# Name: master-03
# Roles: master
# Labels: beta.kubernetes.io/arch=amd64
# beta.kubernetes.io/os=linux
# kubernetes.io/arch=amd64
# kubernetes.io/hostname=master-03
# kubernetes.io/os=linux
# node-role.kubernetes.io/master=
# Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
# node.alpha.kubernetes.io/ttl: 0
# projectcalico.org/IPv4Address: 10.10.107.193/24
# projectcalico.org/IPv4IPIPTunnelAddr: 10.100.133.128
# volumes.kubernetes.io/controller-managed-attach-detach: true


delete - 删除节点和资源

描述: 可以删除相关节点和资源对象,例如Pods 、Svc、Nodes、 Namespace、 Configmap、 Deployment、rs、rc、sts等。

语法说明:kubectl delete [TYPE] Flags

示例演示:

1
2
3
4
5
# 1.在Master节点上删除指定的节点。
kubectl delete node k8s-master-1

# 2.指定kube-system名称空间删除其Pods。
kubectl -n kube-system delete Pods calico-xxxx


drain - 节点组件清理

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
# 示例1.强制删除节点本地数据以及运行的容器
kubectl drain master-02 --delete-local-data --force --ignore-daemonsets
# WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-amd64-mlcvm, kube-system/kube-proxy-f7rnh
# evicting pod kube-system/coredns-5fd54d7f56-22fwz
# bec pod/coredns-5fd54d7f56-22fwz evicted
# node/server4 evicted
kubectl get nodes master-02
# NAME STATUS ROLES AGE VERSION
# master-02 Ready,SchedulingDisabled <none> 3h36m v1.18.3 # 不再调用此结点

# 示例2.强制删除处于terminal状态或者异常状态的Pod,等待时间为0
kubectl delete pod -n ingress-nginx --force --grace-period=0 ingress-nginx-controller-6b8bd48548-jmblv


exec - 在pod中的容器环境内执行命令(和命令docker exec 类似)

语法参数:

1
2
kubectl exec Pod名称 操作命令
kubectl exec -n 名称空间 -ti Pod名称 -c 容器名称 -- /bin/sh

基础示例:

1
2
3
4
5
6
7
# (1) 在名称为 nginx-pod-xxxxxx 的Pod中运行bash。
kubectl exec -it nginx-deployment-674ff86d-btmt4 /bin/bash
# kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
# root@nginx-deployment-674ff86d-btmt4:/#

# (2) 进入Pod多个容器中的其中一个容器,例如进入名称为 weiyigeek 的Pod中的blog容器。
kubectl exec -n test -ti weiyigeek -c blog -- /bin/sh


expose - 将资源公开保留为新的SVC服务。

描述:按名称查找 deployment, service, replica set, replication controller or pod,并使用该资源的选择器作为指定端口上新服务的选择器, 即创建新的服务。

温馨提示: 如果没有端口通过–port指定,并且公开的资源有多个端口,所有端口都将被新服务。此外如果未指定标签,新服务将重新使用它暴露的资源。

可能的资源包括(不区分大小写):pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
# 语法
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP]
[--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
[options]

# 常用参数
--name='': 新创建的对象的名称。
--port='': SVC 服务端口。
--target-port='': Pod 容器端口。
--protocol='': SVC 服务网络协议, 默认TCP。
--type='': 指定服务类型,可用范围`ClusterIP, NodePort, LoadBalancer, or ExternalName. Default
is 'ClusterIP'`。

基础实例:

1
2
3
4
5
6
7
8
9
# 1.为 nginx 部署创建一个服务名为nginx-external ,该部署服务于端口80并连接到Pod容器的8080端口
kubectl expose deployment nginx --name nginx-external --type=ClusterIP --port=80 --target-port=8000

# 2.为 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
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# nginx-web-external NodePort 10.102.35.45 <none> 80:30230/TCP 70s


get - 显示资源列表

描述: 显示kubernetes相关资源对象信息,例如Pods 、Svc、Nodes、 Namespace、 Configmap、 Deployment、rs、rc、sts相关资源信息。

基础语法

1
2
3
4
5
6
7
# 语法
kubectl get 资源类型
# 参数
-l #获取相关label标签的资源列表
-o #以 wide,yaml,jsonpath="{..image}",go-template 格式化输出
--namespace #查找指定名称空间下的 Pod
--template #使用 go-template 格式化


基础示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# 1.获取类型为Deployment的资源列表
kubectl get deployments
# NAME READY UP-TO-DATE AVAILABLE AGE
# nginx-deployment 1/1 1 1 8h

# 2.获取类型为Pod的资源列表
kubectl get pods # 默认显示名称为default的pod列表
kubectl get pods --all-namespaces #执行命令,获取所有名称空间中的所有 Pod
# NAME READY STATUS RESTARTS AGE
# nginx-deployment-674ff86d-btmt4 1/1 Running 0 8h
kubectl get pods -l app=nginx # 获取相关label标签的资源列表
# NAME READY STATUS RESTARTS AGE
# nginx-deployment-cc7df4f8f-2jlnp 1/1 Running 0 47m
# nginx-deployment-cc7df4f8f-jxwrs 1/1 Running 0 47m

# 采用jsonpath过滤语法获取符合条件得得Pod名称
kubectl get pods -n kube-system -l "app.kubernetes.io/name=kubernetes-dashboard,app.kubernetes.io/instance=kubernetes-dashboard" -o jsonpath="{.items[0].metadata.name}" # kubernetes-dashboard-879457794-kxvcr

# 使用 -o jsonpath={..image} 参数,输出结果将格式化为只包含容器镜像名字的形式
kubectl get pods --namespace kube-system -o jsonpath="{..image}" # 按名称空间查找容器
kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=redis # redis redis:latest

kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' |sort | uniq -c # jsonpath 将空格替换为新的行并对对结果排序,然后进行计数
# 24 calico/cni:v3.13.1
# 2 calico/kube-controllers:v3.13.1
# 12 calico/node:v3.13.1
# 12 calico/pod2daemon-flexvol:v3.13.1
# 4 mirrorgcrio/coredns:1.6.7
# 6 mirrorgcrio/etcd:3.4.3-0
# 6 mirrorgcrio/kube-apiserver:v1.18.4
# 6 mirrorgcrio/kube-controller-manager:v1.18.4
# 12 mirrorgcrio/kube-proxy:v1.18.4
# 6 mirrorgcrio/kube-scheduler:v1.18.4
# 1 redis
# 1 redis:latest

kubectl get pod -n weiyigeek -l ref=info-student -o jsonpath="{.items[*].status.podIP}" | tr -s '[[:space:]]' '\n' > ip.txt
for x in $(cat ip.txt);do echo -n "$x - ";curl -v http://${x}:8080/ ;echo "";done

#用 Pod 中 image 字段的绝对路径来查找容器的镜像名字,可以规避 image 字段重复出现的情况。
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |tr -s '[[:space:]]' '\n' | uniq -c | sort -r
# .items[*]:每一个返回值
# .spec: 获取 spec
# .containers[*]: 每一个 container
# .image:获取 image

kubectl get pods -o jsonpath="{.items[*].spec.containers[*].image}" |tr -s '[[:space:]]' '\n' | uniq -c | sort -r
# 1 redis

# 如果通过名字查找 Pod由于返回结果只有一个 Pod,此时,.items[*] 这一部分应该从 jsonpath 中移除(效果同上)
kubectl get pods redis-master-deployment-7d557b94bb-bzw2v -o jsonpath="{.spec.containers[*].image}" |tr -s '[[:space:]]' '\n' | uniq -c | sort -r
# 1 redis

# map[containerPort:6379 protocol:TCP]
# 按Pod查找容器输出结果可以通过 rannge 操作遍历(值得学习分隔)
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |sort
# redis-master-deployment-7d557b94bb-bzw2v: redis,
kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"
kubectl get pods redis-master-deployment-7d557b94bb-bzw2v --template='{{(index (index .spec.containers 0).ports 0)}}{{"\n"}}' ##使用go-template罗列容器进行Json解析
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.namespace}{":\t"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.hostPath.path}{", "}{end}{end}' | sort


# 3.获取类型为Node的资源列表
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# k8s Ready master 29h v1.18.2
kubectl get nodes -o wide
# NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
# ks8test Ready master 23h v1.18.3 10.10.107.193 <none> CentOS Linux 7 (Core) 5.7.0-1.el7.elrepo.x86_64 docker://19.3.9
# node-1 Ready <none> 41m v1.18.3 10.20.172.82 <none> CentOS Linux 7 (Core) 5.7.0-1.el7.elrepo.x86_64 docker://19.3.9


# 4.名称空间在命令后增加 -A 或 --all-namespaces 可查看所有 名称空间中 的对象,使用参数 -n 可查看指定名称空间的对象,
# 查看所有名称空间的 Deployment
kubectl get deployments -A # --all-namespaces
# 查看 kube-system 名称空间的 Deployment
kubectl get deployments -n kube-system
# NAME READY UP-TO-DATE AVAILABLE AGE
# calico-kube-controllers 1/1 1 1 29h
# coredns 2/2 2 2 29h


# 5.Services抽象层查看
kubectl get services -o wide
kubectl get svc -o wide
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
# kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40h <none>
# redis-master-service ClusterIP 10.99.192.159 <none> 6379/TCP 8m24s app=redis,role=master,tier=backend


# 6.指定名称空间的配置信息查看
kubectl get cm kubeadm-config -n kube-system -o yaml
# apiVersion: v1
# data:
# ClusterConfiguration: |
# apiServer:
# extraArgs:
# authorization-mode: Node,RBAC
# timeoutForControlPlane: 4m0s
# apiVersion: kubeadm.k8s.io/v1beta2


# 7.指定名称空间选举信息查看
kubectl get ep kube-controller-manager -n kube-system -o yaml
# apiVersion: v1
# kind: Endpoints
# metadata:
# annotations:
# control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"master-01_137ddc1b-55bf-413b-81d3-f76654daa41e","leaseDurationSeconds":15,"acquireTime":"2020-06-24T03:51:16Z","renewTime":"2020-06-28T07:56:52Z","leaderTransitions":6}'
# creationTimestamp: "2020-06-23T04:45:29Z"


# 8.查看 ReplicaSet(副本) 状态与信息
kubectl get rs
# NAME DESIRED CURRENT READY AGE
# redis-master-deployment-7d557b94bb 1 1 1 4m46s

补充说明:
示例.以YAML的格式显示 k8s 中 kubeadm-config 的配置;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
~$ kubectl get cm -o yaml -n kube-system kubeadm-config
apiVersion: v1
data:
ClusterConfiguration: |
apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: weiyigeek.k8s:6443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.19.3
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.100.0.0/12
scheduler: {}
ClusterStatus: |
apiEndpoints:
ubuntu:
advertiseAddress: 10.10.107.202
bindPort: 6443
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterStatus
kind: ConfigMap
metadata:
creationTimestamp: "2020-11-04T13:30:06Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:ClusterConfiguration: {}
f:ClusterStatus: {}
manager: kubeadm
operation: Update
time: "2020-11-04T13:30:06Z"
name: kubeadm-config
namespace: kube-system
resourceVersion: "162"
selfLink: /api/v1/namespaces/kube-system/configmaps/kubeadm-config
uid: ee701525-7242-42b3-bc64-6c7ac27dd5d3

注意事项:

  • 注意并非所有对象都在名称空间里;


logs - 查看pod中的容器的打印日志(和命令docker logs 类似)

描述:输出pod中一个容器的日志,如果pod只包含一个容器则可以省略容器名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# kubectl logs [Pod名称]
-c, --container="": 容器名。
-f, --follow[=false]: 指定是否持续输出日志。
--interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true
--limit-bytes=0: 输出日志的最大字节数。默认无限制。
-p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。
--since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
--since-time="": 仅返回指定时间(RFC3339格式)之后的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
--tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。
--timestamps[=false]: 在日志中包含时间戳。

#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-deployment-674ff86d-btmt4

# 返回pod ruby中已经停止的容器web-1的日志快照
$ kubectl logs -p -c ruby web-1

# 持续输出pod ruby中的容器web-1的日志
$ kubectl logs -f -c ruby web-1

# 仅输出pod nginx中最近的20条日志
$ kubectl logs --tail=20 nginx

# 输出pod nginx中最近一小时内产生的所有日志
$ kubectl logs --since=1h nginx

# 输出命名空间为WeiyiGeek,pods为Blog的日志仅返回指定时间(RFC3339格式)之后的日志并且仅仅输出1024bytes
# 注意, 北京时间需要+8小时
$ kubectl logs Blog -n WeiyiGeek --since-time="2021-12-23T20:20:59Z" --limit-bytes=1024


run - 运行一个pod应用

基础示例:

1
2
3
4
5
# 示例1.这是一种自主式的pod建立方式,还有一种deployment控制器方式;
kubectl run helloworld --image=hello-world
pod/helloworld created
# 查看执行的结果日志
# kubectl logs helloworld


replace - 用文件名或stdin替换资源

描述: 该命令支持JSON和YAML格式,可以帮助我们快速更换现有资源。

语法参数:

1
2
3
-f, --filename=[]: 指定格式的资源文件。
--force=false: 强制删除资源。
--wait=false: 如果为真,等待资源消失后再返回。

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
# 1.使用json或者yaml格式,替换现有资源。
kubectl replace -f ./pod.json
kubectl replace -f ./deployment.yaml

# 2.根据传递给stdin的JSON替换一个pod
cat pod.json | kubectl replace -f -

# 3.将单个容器吊舱的图像版本(标签)更新为v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# 4.强制替换、删除,然后重新创建资源
kubectl replace --force -f ./pod.json


port-forward - 使用资源的名称来进行本地端口转发pod

描述: 将一个或多个本地端口转发到pod, 此命令要求节点安装 socat, 使用资源类型/名称(如deployment/mydeployment)来选择pod, 如果省略资源类型默认为“pod”。

适用范围 Pod(缺省)、Service、RC、deployment。

Tips : 转发会话结束当选定的pod终止时,需要重新运行命令才能恢复转发。

语法参数:

1
2
3
4
5
6
# 语法
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,大于零)


基础实例:

1
2
3
4
5
6
7
8
9
10
11
# - (0) 在本地的随机端口上侦听,转发到pod中的5000
kubectl port-forward pod/mypod :5000

# - (1) 本地侦听端口 8443 转发到服务选择的pod中名为“https”的服务端口的targetPort
kubectl port-forward service/myservice 8443:https

# - (2) 映射 redis-master-7d557b94bb-bzw2v Pod 的 6379 到 127.0.0.1,10.10.107.191 接口的7000
kubectl port-forward --address 127.0.0.1,10.10.107.191 pod/redis-master-7d557b94bb-bzw2v 7000:6379
# Forwarding from 10.10.107.191:7000 -> 6379
# Forwarding from 127.0.0.1:7000 -> 6379
# Handling connection for 7000

label - 节点、资源标签更新与设置

描述: 更新资源的标签信息,我们可以根据标签来设置Pod与节点亲和性。

1
2
3
4
5
6
# 节点角色名称设置
~$ kubectl label node weiyigeek-223 node-role.kubernetes.io/work=test
node/weiyigeek-223 labeled

# 取消节点角色名称
kubectl label node weiyigeek-223 node-role.kubernetes.io/work

top - 集群相关Metrics资源数据查看(类比于Linux下的Top)

1
2
3
# (1) 没有安装 Kubernerters-Metrics-Server 的时候将会显示以下错误;
~$ kubectl top node
error: Metrics API not available

scale - 动态更新副本数

描述: 为部署、副本集、复制控制器或有状态集设置新大小。

1
kubectl -n app scale statefulset/xk-student --replicas=0


set - 配置应用程序资源

命令参数

1
2
3
4
5
6
7
8
9
# Usage:
kubectl set SUBCOMMAND [options]
# Available Commands:
env 更新模板环境变量
image 更新模板镜像地址
resources 在对象的 pod templates 上更新资源的 requests/limits
selector 设置 resource 的 selector
serviceaccount 更新资源服务账户
subject 更新角色绑定或群集角色绑定中的用户、组或服务帐户

使用案例

1
2
3
4
5
6
7
8
# 1.设置deployment控制器管理的nginx资源,将nginx容器的镜像换成1.21.0
kubectl set image deployment/nginx busybox=busybox:latest nginx=nginx:1.21.0

# 2.将所有deployment和rc的nginx容器映像更新为“nginx:1.9.1”
kubectl set image deployments,rc nginx=nginx:1.9.1 --all

# 3.将守护程序abc的所有容器的映像更新为“nginx:1.9.1”
kubectl set image daemonset abc *=nginx:1.9.1


wait - 等待一个或多个资源的特定条件(实验性)

描述: 该命令会占用多个资源,通过使用–for标志等待在每个给定对象的状态字段中看到指定的条件资源,并将向标准输出一条成功消息,指示何时满足指定条件,同时可以使用-o选项更改为输出目标。

格式化输出文件类型:

1
2
-o, --output='': Output format. One of:
json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file.

简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1.等待Ingress相关资源Pod状态为Ready,使用标签选择器,超时实践为120
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=120s
# pod/ingress-nginx-controller-847949b9d7-9fzrj condition met

kubectl wait pod --namespace devtest \
--for=condition=Ready \
--selector=app=oa \
--timeout=120s

# 2.等待pod“busybox1”包含类型为“Ready”的状态条件
kubectl wait --for=condition=Ready pod/busybox1

# 3.状态条件的默认值为true,可以将其设置为false
kubectl wait --for=condition=Ready=false pod/busybox1

# 4.等待pod“busybox1”包含“正在运行”的状态阶段。
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/busybox1

# 发出“删除”命令后,等待pod“busybox1”被删除,超时60秒
kubectl delete pod/busybox1
kubectl wait --for=delete pod/busybox1 --timeout=60s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#查看当前更新状态
kubectl rollout status deployments nginx-deployment
kubectl get pods
#查看可回滚的历史版本
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment
##可以使用--revision参数指定回退到某个历史版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
##暂停 deployment的更新
kubectl rollout pause deployment/nginx-deployment


$ kubectl get ep -o wide
NAME ENDPOINTS AGE
deploy-blog-svc 10.244.0.209:80,10.244.1.196:80,10.244.2.99:80 34d
deploy-maven-svc 10.244.0.236:8080,10.244.1.221:8080,10.244.2.124:8080 32d
kubernetes 10.10.107.202:6443 83d
# 在Kubenates的上创建devops命名空间,用于Jenkins使用
kubectl create namespace devops

# 在Kubernetes上为Jenkins构建创建有Cluster Admin权限的Service Account jenkins:
kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=devops:jenkins

Tips : 创建Deployment控制器控制的资源,实际上不加port也能通过服务进行发现实际工作中一定要加上为了后期问题的排查

Tips : 可以采用直接 RUN 创建Pod, 实际上不加port也能通过服务进行发现实际工作中一定要加上为了后期问题的排查
kubectl run nginx --image nginx:latest --port=80 --replicas=2


~$ kubectl get clusterroles system:aggregate-to-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
creationTimestamp: "2021-01-11T04:55:10Z"
labels:
kubernetes.io/bootstrapping: rbac-defaults
rbac.authorization.k8s.io/aggregate-to-admin: "true"
managedFields:
- apiVersion: rbac.authorization.k8s.io/v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:rbac.authorization.kubernetes.io/autoupdate: {}
f:labels:
.: {}
f:kubernetes.io/bootstrapping: {}
f:rbac.authorization.k8s.io/aggregate-to-admin: {}
f:rules: {}
manager: kube-apiserver
operation: Update
time: "2021-01-11T04:55:10Z"
name: system:aggregate-to-admin
resourceVersion: "50"
selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/system%3Aaggregate-to-admin
uid: 93f094d8-f5f6-42c6-bcc8-e6ca9bb0f37a
rules:
- apiGroups:
- authorization.k8s.io
resources:
- localsubjectaccessreviews
verbs:
- create
- apiGroups:
- rbac.authorization.k8s.io
resources:
- rolebindings
- roles
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch

参考地址: https://www.cnblogs.com/shunzi115/p/12392056.html