在k8s环境中直接管理的是pod,是k8s里的最小的调度单位。一个pod里可以有多个容器,一般情况下我们只会在pod里面设计一个容器。
master节点上运行的程序:
kubectl 是命令行工具,用户要创建,删除什么东西,一般都用它来实现。
api-server 是一个接口,接收用户发送的请求。
scheduler 调度器,当用户创建pod时,判定这个pod将会被调度到哪台worker上创建。
control-manager 整个k8s的大管家,包括检测节点状态,pod数目等
以下组件是在所有的节点上都有的
kubelet 在包括master在内的所有节点上运行,是一个代理。接收master分配过来的任务,并把节点信息反馈给master上的api-server
kube-proxy 在包括master在内的所有节点上运行,用于把发送给service的请求转发给后端的pod,其模式有iptables和ipvs
calico网络 使得节点中的pod能够互相通信。
常见的一些命令
--查看kubernetes集群信息
[root@master ~]# kubectl cluster-info
--查看k8s版本
[root@master ~]# kubectl version --output=json
#[root@master ~]# kubectl get ns获取当前有多少命名空间
设置metric-server监控pod以及节点的负载
#1 下载metric server的mainifest
[root@master ~]# curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
#2 修改components.yaml,添加hostNetwork: true和- --kubelet-insecure-tls
spec:
hostNetwork: true
containers:
- args:
- --kubelet-insecure-tls
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.k8s.io/metrics-server/metrics-server:v0.6.3
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
#3 部署metric-server
[root@master ~]# kubectl apply -f components.yaml
#4 验证
[root@master ~]# kubectl get pods -n kube-system
[root@master ~]# kubectl top nodes
#查看metric-server状态
[root@master ~]# kubectl get pods -n kube-system | grep metric
升级k8s,从版本1.25.4升级到1.26.4
因为k8s集群是通过kubeadm的方式安装的,然后通过kubeadm初始化安装其他组件。所以升级k8s一定要按照顺序。 先升级master,再升级worker.如果有多个master,则需要一台台地升级,最后再升级worker. 不管是master还是worker,都是先升级kubeadm,然后执行kubeadm upgrade,再升级kubelet和kubectl
master node升级
升级前检查工作
1. Make sure you read the release notes carefully.
2. The cluster should use a static control plane and etcd pods or external etcd.
3. Make sure to back up any important components, such as app-level state stored in a database. kubeadm upgrade does not touch your workloads, only components internal to Kubernetes, but backups are always a best practice.
4. Swap must be disabled.
#首先升级master node也就是control plane node,列出可升级版本
[root@master ~]# yum list --showduplicate kubeadm --disableexcludes=kubernetes
#升级kubeadm
[root@master ~]# yum install -y kubeadm-1.26.4-0 --disableexcludes=kubernetes
#kubeadm升级完成之后,验证kubeadm版本
[root@master ~]# kubeadm version
#通过kubeadm upgrade plan查看集群是否需要升级,以及能升级的版本
[root@master ~]# kubeadm upgrade plan
#把control plane node设置为维护模式
[root@master ~]# kubectl drain master --ignore-daemonsets
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready,SchedulingDisabled control-plane 232d v1.25.4
worker1 Ready <none> 232d v1.25.4
worker2 Ready <none> 232d v1.25.4
#升级kubernetes集群里的master上的各个组件
[root@master ~]# kubeadm upgrade apply v1.26.4
#升级kubelet和kubectl
[root@master ~]# yum install -y kubelet-1.26.4-0 kubectl-1.26.4-0 --disableexcludes=kubernetes
#重启服务
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart kubelet
#验证kubectl版本
[root@master ~]# kubectl version --short
#取消control plane node的维护模式
[root@master ~]# kubectl uncordon wask8s1
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 232d v1.26.4
worker1 Ready <none> 232d v1.25.4
worker2 Ready <none> 232d v1.25.4
此时可以看到master node的版本已经更新到v1.26.4
至此control plane node的更新完成,如果有多个control plane node,升级步骤一样,只是把kubeadm upgrade apply v1.26.4换成kubeadm upgrade node即可。
worker node升级
升级worker node的步骤基本和master node升级一致,也是先升级kubeadm,然后把node设置为维护模式,升级组件,最后升级kubectl和kubelet
#升级kubeadm
[root@worker1 ~]# yum install -y kubeadm-1.26.4-0 --disableexcludes=kubernetes
#在master node(control plane node)上把worker1设置为维护模式
[root@worker1 ~]# kubectl drain worker1 --ignore-daemonsets
node/worker1 cordoned
error: unable to drain node "worker1" due to error:[cannot delete Pods declare no controller (use --force to override): default/local-pod, cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-588dcc57c-nkgdd], continuing command...
There are pending nodes to be drained:
worker1
cannot delete Pods declare no controller (use --force to override): default/local-pod
cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-588dcc57c-nkgdd
刚开始报错,添加参数--delete-emptydir-data --force之后重新尝试。这里是因为有一个使用local-storage的volume,这种是用来存放临时数据的。
当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候,就需要用--force来强制执行
[root@worker1 ~]# kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data --force
[root@worker1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 232d v1.26.4
worker1 Ready,SchedulingDisabled <none> 232d v1.25.4
worker2 Ready <none> 232d v1.25.4
#在worker1 node上更新k8s集群组件
[root@在worker1 ~]# kubeadm upgrade node
[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks
[preflight] Skipping prepull. Not a control plane node.
[upgrade] Skipping phase. Not a control plane node.
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
#更新kubelet和kubectl
[root@在worker1 ~]# yum install -y kubelet-1.26.4-0 kubectl-1.26.4-0 --disableexcludes=kubernetes
#重启服务
[root@worker1 ~]# systemctl daemon-reload
[root@worker1 ~]# systemctl restart kubelet
#在master node上取消worker1 node的维护模式
[root@worker1 ~]# kubectl uncordon 在worker1
node/worker1 uncordoned
pod
创建pod
[root@master ~]# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent
选项--image-pull-policy=IfNotPresent表示本地有镜像的话,有限使用本地镜像,如果本地没有,才会去下载。
#查看创建好的pod
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod1 1/1 Running 0 22s xxx.xxx.xxx worker2 <none> <none>
kubectl get pods --all-namespaces --show-labels
其中--all-namespaces表示列出所有namespace里面的pod
--show-labels显示pod的标签,也可以用-l run=pod1显示标签run=pod1的pod
#删除pod,,--force参数可以加快delete速度,为可选项。
[root@master ~]# kubectl delete pod pod1 --force
pod "pod1" deleted
也可以通过kubectl delete -f pod1.yaml删除pod
#生成yaml文件创建pod
[root@master pod]# kubectl run pod1 --image=nginx --dry-run=client -o -- "command" yaml > pod1.yaml
--dry-run=client是模拟创建pod,并不会真的创建,-o yaml是以yaml文件的格式输出并把结果重定向到pod1.yaml中。
第二组"--"是指定pod里面运行什么进程。
#在pod中执行命令
[root@master pod]# kubectl exec pod1 -- ls /usr/share/nginx/html
50x.html
index.html
#拷贝文件
从物理机拷贝文件到pod
[root@master pod]# kubectl cp /etc/hosts pod1:/usr/share/nginx/html
[root@master pod]# kubectl exec pod1 -- ls /usr/share/nginx/html
50x.html
hosts
index.html
从pod拷贝文件到物理机
[root@master pod]# kubectl cp pod1:/usr/share/nginx/html/ /data/
tar: Removing leading `/' from member names
这里表示把pod1:/usr/share/nginx/html/目录下面的文件拷贝到物理机的/data目录下,如果是拷贝具体文件的话,需要在物理机上指定文件名。
yaml文件相关
yaml文件的写法是分级的,子级和父级之间要缩进2个空格(不能用tab键),子级的第一个位置可以用"-"开头,需要和父级对齐。
查看pod有多少一级参数,可以用kubectl explain pods
查看每个参数下面有多少参数,可以用kubectl explain命令
查看spec下面有多少选项,可以用kubectl explain pods.spec
查看spec.containers有多少选项,可以使用kubectl explain pods.spec.containers
通过yaml文件创建pod
[root@master pod]# kubectl apply -f pod1.yaml
pod/pod1 created