【DevOps基础篇之k8s】如何通过Kubernetes CKA认证考试
@TOC
推荐超级课程:
核心概念
查看 dev
namespace下的资源:
kubectl get pods -n dev
查看所有 namespaces 下的pod:
kubectl get pods -A
查看所有namespace下的所有资源:
kubectl get all -A
生成一个pod yaml,其中镜像用: nginx
image 并且加上标签 label env=prod
:
kubectl run nginx --image=nginx --labels=env=prod --dry-run=client -o yaml > nginx_pod.yaml
快速删除 pod nginx
:
kubectl delete pod nginx --grace-period 0 --force
生成一个 Deployment yaml file:
kubectl create deploy --image=nginx nginx --dry-run=client -o yaml > nginx-deployment.yaml
访问一个在dev
namespace下的名为 test-service
的service:
test-service.dev
创建一个 pod valid-pod
, 并使用端口 444,名称为 frontend
:
kubectl expose pod valid-pod --port=444 --name=frontend
用yaml重建一个pod:
kubectl replace --force -f nginx.yaml
编辑 deployment nginx
:
kubectl edit deploy nginx
设置 deployment nginx
的image版本:
kubectl set image deploy nginx nginx=nginx:1.18
伸缩 deployment nginx
到4并进行record action:
kubectl scale deploy nginx --repliacs=4 --record
获取当前namespace下的event:
kubectl get events
通过标签获取pod:
kubectl get pods --show-labels
获取标签为env=dev
的pod :
kubectl get pods -l env=dev
获取node node01
的taint:
kubectl describe node node01 | grep -i Taints:
给node node01
加上标签 size=small
:
kubectl label nodes node01 size=small
默认静态pod路径是:
/etc/kubernetes/manifests
查看pod的log:
kubectl logs nginx
查看多个pod的日志:
kubectl logs <pod_name> -c <container_name>
资源监控
查看node的资源使用:
kubectl top node
查看pod和其中container的资源使用率:
kubectl top pod --containers=true
生命周期管理
查看 deployment app
的rollout状态:
kubectl rollout status deployment/app
查看deployment app
的rollout历史:
kubectl rollout history deployment/app
撤销 rollout:
kubectl rollout undo deployment/app
创建 configmap app-config
并添加 env=dev
:
kubectl create configmap app-config --from-literal=env=dev
创建 secret app-secret
并添加 pass=123
:
kubectl create secret generic app-secret --from-literal=pass=123
Cluster维护
销毁 node node01
:
kubectl drain node01
使node进入可用状态:
kubectl uncordon node01
升级集群的 kubeadm:
kubeadm upgrade plan
apt-get upgrade -y kubeadm=1.18.0-00
kubeadm upgrade apply v1.18.0
apt-get upgrade -y kubelet=1.18.0-00
systemctl restart kubelet
Backup etcd:
export ETCDCTL_API=3
etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /tmp/etcd-backup.db
Restore etcd:
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db --data-dir /var/lib/etcd-backup
在编辑/etc/kubernetes/manifests/etcd.yaml
之后,
更改文件 /var/lib/etcd
为 /var/lib/etcd-backup
.
安全认证
创建 service account sa_1
kubectl create serviceaccount sa_1
查看 kube-apiserver certificate:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
承认用户 john的证书认证:
kubectl certificate approve john
查看 kubeconfig :
kubectl config view
查看当前context:
kubectl config current-context
使用 context dev-user@dev:
kubectl config use-context prod-user@production
验证用户john
是否可以创建 deployments:
kubectl auth can-i create deployments --as john
创建 role dev
并使其可以创建 secrets:
kubectl create role dev --verb=create --resource=secret
绑定 role dev
到 user john
:
kubectl create rolebinding dev-john --role dev --user john
查看 namespaced 资源:
kubectl api-resources --namespaced=true
问题排查
查看 kube-system 相关的 pods:
kubectl get pods -n kube-system
查看所有node状态是否ready
:
kubectl get nodes
查看node的磁盘,内存状况:
df -h
top
查看 kubelet
服务状况:
systemctl status kubelet
查看 kubelet
service logs:
sudo journalctl -u kubelet
查看 kubelet service 详细信息:
ps -aux | grep kubelet
查看 cluster 信息:
kubectl cluster-info
查看 pod CIDR:
kubectl describe node | less -p PodCIDR
获取所有pod并按照时间排序:
kubectl get pod -A --sort-by=.metadata.creationTimestamp
查找 node-master
的CIDR:
ssh node0master
cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep range
查找在node-master
上用的CNI插件:
ls /etc/cni/net.d/
查找event并按照时间排序:
kubectl get events -A --sort-by=.metadata.creationTimestamp
查看所有node的内部IP:
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'
其他
- 为了创建daemonset, 使用
kubectl create deploy
命令创建一个 .yaml文件,然后更改kind
,删除replicas
&strategy
. - 为了查找static pod manifest 路径, 查看命令
kubelet service
或者kubelet配置文件的staticPodPath
参数。 - 为了创建static pod, 需要把yaml文件放在
staticPodPath
目录. - 可通过pod名称后缀
-<node_name>
来识别其是否为static pod。 - 为了添加新的 scheduler,复制文件,并在container的command中加入
--leader-elect=false
&--scheduler-name=my-scheduler-name
. - 在pod的
spec
的schedulerName
定义指定要使用的scheduler. - 通过pod的
command
来覆盖默认的ENTRYPOINT
. 使用args
覆盖Dockerfile 中的CMD
参数。