k8s学习系列

81 阅读6分钟

在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