K8S入门

215 阅读21分钟

一、入门

(一) 为什么需要K8S

1. 传统部署时代

  • 资源未隔离:同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降
  • 资源浪费:各个服务是在物理服务器上运行,当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用。资源浪费。

2. 虚拟化部署时代

  • 资源隔离成功:单个物理服务器的 CPU 上运行多台虚拟机(VM),应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性。
  • 重量级虚拟机:虚拟机包含完整的虚拟硬件以及完整的操作系统资源,导致在一定程序上浪费资源。

3. 容器部署时代

  • 轻量级&隔离性:容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。
  • 跨平台:容器的出现解决了应用和基础环境异构的问题,让应用可以做到一次构建,多次部署。

4. 容器时代依旧存在的问题

  • ① 无法高可用:无法自动监控容器的状态,以及自动故障转移。
  • ② 无法自行扩缩:缩高并发场景下,突增的并发量,需要更多的web服务容器分担访问压力,以及当并发量减小无法下线服务以节省资源。
  • ③ 维护和版本升级,无法备份旧版本,逐步上线新版本,一旦错误,需要手动启动之前容器保证系统运行。

K8S可以很好的解决上述全部问题。

(二) 简介

  • 起源

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有8个字符。 Google 在 2014 年开源了 Kubernetes 项目。

  • 简介

Kubernetes 是一个开源的容器编排引擎和容器集群管理工具,用来对容器化应用进行自动化部署 扩缩管理

且发展到现在,k8s支持的服务器节点数量2000台,且pod数量支持150000个。

  • 中文文档

imroc.cc/kubernetes

(三) K8S可以做

  • 服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址来曝露容器。 如果进入容器的流量很大Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • ② 存储编排

Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • ③ 自动部署和回滚

****你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • ④ 自动完成装箱计算

****你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

  • ⑤ 自我修复

Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

二、使用

(一) K8S架构

一个Kubernetes集群至少包含一个控制平面(control plane),以及一个或多个工作节点(worker node)。

  • 控制平面(Control Plane) : 控制平面负责管理工作节点和维护集群状态。所有任务分配都来自于控制平面。
  • 工作节点(Worker Node) : 工作节点负责执行由控制平面分配的请求任务,运行实际的应用和工作负载。

1. 工作节点Work Node

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。-- 真正干活儿的

  • ① 容器运行时(Container Runtime)
    负责运行容器的软件。Kubernetes 支持许多容器运行环境,例如 containerd、docker的容器。

从V1.24开始,kubernetes默认容器运行时使用containerd,不再使用docker。

  • ② kubelet
    管理Pod中的容器,一个pod和运行一组容器,例如:一个业务的MySQL容器和Tomcat容器。kubelet会在集群中每个上运行。
  • ③ kube-proxy

负责管理pod运行所需的网络:kube-proxy 维护节点网络规则和转发流量,实现从集群内部或外部的网络与 Pod 进行网络通信。

2. 控制平面Control Plane

控制平面组件会为集群做出全局决策,比如资源的调度(CPU 内存资源的监控和分配)、检测和响应集群事件。-- 管理层

  • ① kube-apiserver

接受操作指令的组件:如果需要与Kubernetes 集群进行交互,就要通过 API

  • ② kube-scheduler

对pod运行所需要的资源(CPU和内存)进行调度(分配合理的所需资源)

  • ③ etcd

是一个键值对数据库,用于存储配置数据和集群状态信息。

  • ④ kube-controller-manager

整合了k8s集群管理命令


3. 插件

  • DNS
    尽管其他插件都并非严格意义上的必需组件,但几乎所有 Kubernetes 集群都应该有集群 DNS因为很多示例都需要 DNS 服务。
  • **Web 界面(仪表盘)
    **Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身, 并进行故障排除。
  • **容器资源监控
    **容器资源监控将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中, 并提供浏览这些数据的界面。
  • **集群层面日志
    **集群层面日志机制负责将容器的日志数据保存到一个集中的日志存储中, 这种集中日志存储提供搜索和浏览接口。

4. 总结

(二) K8S安装类型

1. minikube

只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。

2. 裸机安装

至少需要两台机器(主节点、工作节点个一台),需要自己安装 Kubernetes 组件,配置会稍微麻烦点。
缺点:配置麻烦,缺少生态支持,例如负载均衡器、云存储。

3. 直接用云平台 Kubernetes

可视化搭建,只需简单几步就可以创建好一个集群。
优点:安装简单,生态齐全,负载均衡器、存储等都给你配套好,简单操作就搞定

4. k3s

安装简单,脚本自动完成。
优点:轻量级,配置要求低,安装简单,生态齐全。

(三) K3S安装

K3s 是一个轻量级的、完全兼容的 Kubernetes 发行版本。非常适合学习。K3s特别适用于边缘计算、物联网、嵌入式和ARM移动端场景

1. 配置要求

  • 最低运行要求**
    **内存: 512MB / CPU: 1 核心
  • K3s版本

v1.25.0+k3s1

  • 系统版本

CentOS 7.9.2009最小化安装

  • 网络要求

外网连通,且彼此内网联通

  • 集群规划
主机名主机名配置
k8s-master192.168.199.1001CPU 2GB
k8s-node1192.168.199.1011CPU 1GB
k8s-node2192.168.199.1021CPU 1GB

2. 服务器准备

  • 克隆服务器并修改ip

(略)

  • 关闭防火墙(所有节点)
systemctl stop firewalld && systemctl disable firewalld
  • 设置主机名(所有节点)
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
  • DNS映射(所有节点)
cat >> /etc/hosts <<EOF
192.168.199.100 k8s-master
192.168.199.101 k8s-node1
192.168.199.101 k8s-node2
EOF
  • 时钟同步(所有节点)
1. 安装时钟同步程序
yum install ntpdate -y


2. 设置相同的时钟配置
ntpdate time.windows.com
  • 设置selinux(所有节点)
yum install -y container-selinux selinux-policy-base
yum install -y https://rpm.rancher.io/k3s/latest/common/centos/7/noarch/k3s-selinux-0.2-1.el7_8.noarch.rpm

3. 安装K3S

准备3个文件,放在所有节点的/opt/modules目录下。

  • K3s 的安装脚本:k3s-install.sh
  • K3s 的二进制文件:k3s
  • K3s 依赖的镜像:k3s-airgap-images-amd64.tar

下载地址:

mirror.rancher.cn/#k3s/v1.25.…

  • ① 移动k3s并添加执行权限(所有节点)
# 1. 移动文件
mv /opt/modules/k3s /usr/local/bin/

# 2. 添加执行权限
chmod +x /usr/local/bin/k3s
  • ② 移动镜像文件(所有节点)
# 1. 创建目录
mkdir -p /var/lib/rancher/k3s/agent/images/

# 2. 移动文件
mv /opt/modules/k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
  • ③ k8s-master安装(仅master节点)
1. 给install.sh脚本添加执行权限
chmod +x k3s-install.sh

2. 执行离线安装
INSTALL_K3S_SKIP_DOWNLOAD=true ./k3s-install.sh

3. 查看节点node状态(需要等待一会儿安装,等待CPU占用率降下来)
kubectl get node
# 结果node状态如果是Ready,则安装好了。如果UnReady,需要在等会儿。
NAME(节点名)		STATUS(状态)		ROLES(角色名)          AGE(运行时间)   VERSION(版本号)
k8s-master   	Ready    				control-plane,master   9s    					v1.25.9+k3s1


4. 查看master认主令牌(复制下来)
cat /var/lib/rancher/k3s/server/node-token
# 假设下面是结果
K10013dd3e86939b8d2bf70d470479b459e03990af9b0a7778d10084536ad7daf93::server:9827249d1ea8d8da0d7a6290e973e32e
  • ④ k8s-node安装(所有node节点)
1. 为k3s-install.sh添加执行权限
chmod +x k3s-install.sh


2. 离线安装
(注意修改k8s-master的ip和token令牌)
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://k8s-master:6443 

=K10013dd3e86939b8d2bf70d470479b459e03990af9b0a7778d10084536ad7daf93::server:9827249d1ea8d8da0d7a6290e973e32e ./k3s-install.sh
  • ⑤ 验证集群安装结果
1. 查看所有的节点。
[root@k8s-master modules]# kubectl get node
NAME         STATUS   ROLES                  AGE     VERSION
k8s-node1    Ready    <none>                 2m5s    v1.25.9+k3s1
k8s-node2    Ready    <none>                 2m      v1.25.9+k3s1
k8s-master   Ready    control-plane,master   6m12s   v1.25.9+k3s1

2. 查看所有的pod
[root@k8s-master modules]# kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   coredns-8b9777675-q65kc                   1/1     Running     0          6m8s
kube-system   local-path-provisioner-69dff9496c-vkm7z   1/1     Running     0          6m8s
kube-system   helm-install-traefik-crd-22ld8            0/1     Completed   0          6m9s
kube-system   svclb-traefik-40eda5a0-5m42v              2/2     Running     0          5m51s
kube-system   metrics-server-5f9f776df5-mw5kk           1/1     Running     0          6m8s
kube-system   helm-install-traefik-4cjzm                0/1     Completed   1          6m9s
kube-system   traefik-66c46d954f-x2k4g                  1/1     Running     0          5m51s
kube-system   svclb-traefik-40eda5a0-gn7x4              2/2     Running     0          117s
kube-system   svclb-traefik-40eda5a0-xgb6c              2/2     Running     0          112s

(四) 卸载K3S

使用install.sh脚本安装方式,会在/usr/local/bin生成卸载脚本

  • ① 查看脚本

ls /usr/local/bin/

1. maser节点
[root@k8s-master ~]# ls /usr/local/bin/
crictl  ctr  k3s  k3s-killall.sh  k3s-uninstall.sh  kubectl

2. node节点
[root@k8s-node1 bin]# ls /usr/local/bin/
crictl  ctr  k3s  k3s-agent-uninstall.sh  k3s-killall.sh  kubectl
  • ② 卸载master

./k3s-uninstall.sh

  • ③ 卸载node

./k3s-agent-uninstall.sh

(五) K8S安装(了解)

1. 环境准备

  • 节点数量: 3 台虚拟机 centos7
  • 硬件配置: 2G或更多的RAM,2个CPU或更多的CPU,硬盘至少30G 以上
  • 网络要求: 多个节点之间网络互通,每个节点能访问外网

2. 集群规划

  • k8s-node1:10.15.0.5
  • k8s-node2:10.15.0.6
  • k8s-node3:10.15.0.7

3. 设置主机名

$ hostnamectl set-hostname k8s-node1  
$ hostnamectl set-hostname k8s-node2
$ hostnamectl set-hostname k8s-node3

4. 同步 hosts 文件

如果 DNS 不支持主机名称解析,还需要在每台机器的 /etc/hosts 文件中添加主机名和 IP 的对应关系:

cat >> /etc/hosts <<EOF
10.15.0.5 k8s-node1
10.15.0.6 k8s-node2
10.15.0.7 k8s-node3
EOF

5. 关闭防火墙

$ systemctl stop firewalld && systemctl disable firewalld

6. 关闭 SELINUX

注意: ARM 架构请勿执行,执行会出现 ip 无法获取问题!

$ setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

7. 关闭 swap 分区

$ swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab

8. 同步时间

$ yum install ntpdate -y
$ ntpdate time.windows.com

9. 安装 containerd

# 安装 yum-config-manager 相关依赖
$ yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 containerd yum 源
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd
$ yum install  -y containerd.io cri-tools  
# 配置 containerd
$ cat >  /etc/containerd/config.toml <<EOF
disabled_plugins = ["restart"]
[plugins.linux]
shim_debug = true
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://frz7i079.mirror.aliyuncs.com"]
[plugins.cri]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
EOF
# 启动 containerd 服务 并 开机配置自启动
$ systemctl enable containerd && systemctl start containerd && systemctl status containerd 

# 配置 containerd 配置
$ cat > /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 配置 k8s 网络配置
$ cat  > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 加载 overlay br_netfilter 模块
$ modprobe overlay
$ modprobe br_netfilter

# 查看当前配置是否生效
$ sysctl -p /etc/sysctl.d/k8s.conf

10. 添加源

  • 查看源
$ yum repolist
  • 添加源 x86
$ cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
$ mv kubernetes.repo /etc/yum.repos.d/
  • 添加源 ARM
$ cat << EOF > kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

$ mv kubernetes.repo /etc/yum.repos.d/

11. 安装 k8s

# 安装最新版本
$ yum install -y kubelet kubeadm kubectl

# 指定版本安装
# yum install -y kubelet-1.26.0 kubectl-1.26.0 kubeadm-1.26.0

# 启动 kubelet
$ sudo systemctl enable kubelet && sudo systemctl start kubelet && sudo systemctl status kubelet

12. 初始化集群

  • 注意: 初始化 k8s 集群仅仅需要再在 master 节点进行集群初始化!
$ kubeadm init \
--apiserver-advertise-address=10.15.0.5 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--cri-socket=unix:///var/run/containerd/containerd.sock

# 添加新节点
$ kubeadm token create --print-join-command --ttl=0
$ kubeadm join 10.15.0.21:6443 --token xjm7ts.gu3ojvta6se26q8i --discovery-token-ca-cert-hash sha256:14c8ac5c04ff9dda389e7c6c505728ac1293c6aed5978c3ea9c6953d4a79ed34

13. 配置集群网络

创建配置: kube-flannel.yml ,执行 kubectl apply -f kube-flannel.yml

  • 注意: 只在主节点执行即可!
---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
       #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
       #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
       #image: flannelcni/flannel:v0.20.2 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

14. 查看集群状态

# 查看集群节点状态 全部为 Ready 代表集群搭建成功
$ kubectl get nodes
NAME        STATUS   ROLES           AGE   VERSION
k8s-node1   Ready    control-plane   21h   v1.26.0
k8s-node2   Ready    <none>          21h   v1.26.0
k8s-node3   Ready    <none>          21h   v1.26.0

# 查看集群系统 pod 运行情况,下面所有 pod 状态为 Running 代表集群可用
$ kubectl get pod -A
NAMESPACE      NAME                                READY   STATUS    RESTARTS   AGE
default        nginx                               1/1     Running   0          21h
kube-flannel   kube-flannel-ds-gtq49               1/1     Running   0          21h
kube-flannel   kube-flannel-ds-qpdl6               1/1     Running   0          21h
kube-flannel   kube-flannel-ds-ttxjb               1/1     Running   0          21h
kube-system    coredns-5bbd96d687-p7q2x            1/1     Running   0          21h
kube-system    coredns-5bbd96d687-rzcnz            1/1     Running   0          21h
kube-system    etcd-k8s-node1                      1/1     Running   0          21h
kube-system    kube-apiserver-k8s-node1            1/1     Running   0          21h
kube-system    kube-controller-manager-k8s-node1   1/1     Running   0          21h
kube-system    kube-proxy-mtsbp                    1/1     Running   0          21h
kube-system    kube-proxy-v2jfs                    1/1     Running   0          21h
kube-system    kube-proxy-x6vhn                    1/1     Running   0          21h
kube-system    kube-scheduler-k8s-node1            1/1     Running   0          21h

三、namespace 命名空间

(一) 简介

Kubernetes 中命名空间(Namespace)是用来隔离 Kubernetes 集群内的不同资源对象的一种方式。每个 Kubernetes 对象都必须被分配到一个命名空间中

(二) 基本操作

1. 创建 namespace

  • 语法

kubectl create ns namespace名称

  • 案例
[root@k8s-master job]# kubectl create ns app-ns
namespace/app-ns created

2. 查看 namespace

  • 语法

kubectl get ns

  • 案例
[root@k8s-master job]# kubectl get ns
NAME              STATUS   AGE
default           Active   19h
kube-system       Active   19h
kube-public       Active   19h
kube-node-lease   Active   19h
app-ns            Active   57s
app-ns2           Active   52s

3. 查看 namespace 内部信息

  • 语法

kubectl describe ns namespace名字

  • 案例
[root@k8s-master job]# kubectl describe ns app-ns
Name:         app-ns #名字
Labels:       kubernetes.io/metadata.name=app-ns #标签
Annotations:  <none>
Status:       Active # 状态

4. 切换 namespace

  • 语法

kubectl config set-context --current --namespace=namespace名称

  • 案例
1. 查看当前所在的namespace
[root@k8s-master job]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:6443
  name: default
contexts:
- context:
    cluster: default
    namespace:app-ns #当前所在namespace
    user: default
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED



2. 切换namespace
[root@k8s-master job]# kubectl config set-context --current --namespace=app-ns
Context "default" modified.

5. yml 创建 namespace

  • yml语法规范
    • ① 缩进代表上下级关系
    • ② 缩进时候,不允许使用tab跳格,只允许使用空格,通常使用2个空格。
    • : 表示键值对,后面必须有空格
    • -表示多个值,后面必须有空格。
    • #表示注释
  • 指令案例
apiVersion: v1
kind: Namespace
metadata: 
  name: shop
  • 创建命令

kubectl apply -f namespace资源文件.yml

6. 删除 namespace

  • 语法

kubectl delete ns namespace名字

  • 案例
[root@k8s-master job]# kubectl delete ns shop
namespace "shop" deleted

四、Pod&Container

(一) 简介

1. 简介

Pod 是包含一个或多个容器的容器组,是 Kubernetes 中创建和管理的最小对象。

2. 特点

  • ① Pod是kubernetes中最小的调度单位 原子单元 ,Kubernetes直接管理Pod而不是容器。
  • ② 同一个Pod中的容器总是会被自动安排到集群中的同一节点(物理机或虚拟机)上,并且一起调度
  • ③ Pod可以理解为运行特定应用的“逻辑主机”,这些容器共享存储环境(类似同一个文件系统)、网络(类似一个Docker宿主机内部的多个容器网络)和配置声明(如资源限制)。
  • ④ 每个 Pod 有唯一的 IP 地址。 IP地址分配给Pod,在同一个 Pod 内,所有容器共享一个 IP 地址和端口空间(类似Docker的网桥网络)

例如:一个web项目的前端nginx服务,后台tomcat服务,他们需要彼此网络通讯,以及服务于同一个业务,他们的调度生命周期是一致的。通常会放在一个pod中。]

3. 场景

  • 代码自动更新

我们部署了一个node.js的应用,而且部署了几十、上百个节点,那么我希望这个应用可以定时的同步最新的代码,以便自动升级线上环境。

  • 业务服务需要收集日志

某服务模块已经实现了一些核心的业务逻辑,并且稳定运行了一段时间,日志记录在了某个目录下,按照不同级别分别为 error.log、warning.log、info.log,现在希望收集这些日志并发送到统一的日志处理服务器上。

(二) 使用方式

我们会学习使用pod,但是以后实际使用中,不需要我们直接操作pod。

  • 运行单个容器的 Pod。"每个 Pod 一个容器" 模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
  • 运行多个协同工作的容器 的 Pod。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序,通常围绕一个服务单元所需要的容器,放在一个pod中。

(三) pod单容器基本操作

1. k8s命令格式

  • 格式

kubectl 命令 [参数]

  • 帮助

kubectl 命令 --help

  • 查看节点

kubectl get node

  • k8s追踪事件日志

查看k8s平台发生过的关键动作。

kubectl get event

2. 查看pod信息

  • 命名空间:

管理多个pod的逻辑空间。一个k8s集群往往可以部署多个web项目或者服务,他们彼此之间是隔离的,我们在逻辑上可以将分属不同web项目的pod,划分成一个namespace。

  • 命令格式

kubectl get pod [选项]

  • 具体命令
1. 查看pod(查看default这个namespace下的pod)
kubectl get pod

2. 查看指定命名空间下的pod
kubectl get pod -n 命名空间的名字
# 案例
kubectl get pod -n kube-namespace

3. 查看所有命名空间下的pod
kubectl get pod -A

4. 查看pod的详细信息
kubectl get pod -o wide
# 案例:查看默认defualt空间下的pod信息
[root@k8s-master web1]# kubectl get pod -o wide
NAME        READY   STATUS    RESTARTS      AGE   IP          NODE        NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   1 (13m ago)   14m   10.42.1.4   k8s-node1   <none>           <none>
# 案例:查看全部命名空间下的pod信息
[root@k8s-master web1]# kubectl get pod -o wide -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS      AGE   IP          NODE      
kube-system   helm-install-traefik-crd-mkr57            0/1     Completed   0             85m   10.42.0.3   k8s-master
kube-system   helm-install-traefik-rk27h                0/1     Completed   1             85m   10.42.0.2   k8s-master
kube-system   svclb-traefik-6a890758-ws2pr              2/2     Running     0             83m   10.42.2.2   k8s-node2 
kube-system   traefik-66c46d954f-b8wf5                  1/1     Running     0             85m   10.42.0.8   k8s-master
kube-system   svclb-traefik-6a890758-5mgrd              2/2     Running     0             85m   10.42.0.7   k8s-master
kube-system   local-path-provisioner-69dff9496c-2jhx9   1/1     Running     0             85m   10.42.0.4   k8s-master
kube-system   metrics-server-5f9f776df5-6qlbz           1/1     Running     0             85m   10.42.0.5   k8s-master
kube-system   coredns-8b9777675-6smnx                   1/1     Running     0             85m   10.42.0.6   k8s-master
kube-system   svclb-traefik-6a890758-kcq5r              2/2     Running     0             83m   10.42.1.2   k8s-node1 
default       nginx-pod                                 1/1     Running     1 (14m ago)   15m   10.42.1.4   k8s-node1 

5. 实时监控pod状态
kubectl get pod -w
kubectl get pod --watch

6. 查看pod的端口映射
kubectl get pod,svc -o wide

3. 创建pod

  • 命令创建
    • 优点:方便测试和学习
    • kubectl run pod名称 --image=镜像名
# 基于nginx:1.21镜像创建一个nginx-1的pod
kubectl run nginx-pod-1 --image=nginx:1.21

# 一次性使用pod,退出就会删除容器
kubectl run nginx-2 --image=nginx -it --rm --/bin/bash
  • 配置创建
    • 优点:一次编写,多次执行,方便,适用于实际应用部署。
    • ① 创建一个nginx-pod.yml文件
    • ② 编写资源清单
# 版本-固定
apiVersion: v1
# 资源清单类型:Pod
kind: Pod
# 元数据:pod名
metadata:
  name: nginx-pod
# 定义pod的资源
spec:
  containers: #容器相关信息
  - name: nginx-2 # 容器名
    image: nginx:1.21 # 镜像名
    ports:
      - containerPort: 80 # 对外暴露端口
    • ③ 创建pod
      • kubectl apply -f k8s/web1/
# 监控pod的信息
[root@k8s-master modules]# kubectl get pod -w
NAME        READY   STATUS    RESTARTS   AGE
nginx-1     1/1     Running   0          12m
nginx-pod   1/1     Running   0          30s

4. yml 资源清单插件

  • 安装 vscode 插件

  • 输入 pod 提示

5. 删除pod

  • 根据pod名称删除
# 优雅删除,等待nginx忙完当前的事儿以后再关闭。(等店里的客人买完东西就锁门)
kubectl delete pod pod名称
# 强制删除,不管王茜nginx的状态如想·河,直接删除,会导致数据丢失。(慎用)
kubectl delete pod pod名称 --force
  • 删除所有pod
kubectl delete pods --all
  • 根据yml资源清单删除
kubectl delete -f pod资源清单.yml

6. 查看指定pod资源清单

kubectl describe pod pod名称

7. 查看pod日志信息

# 一次性查看pod中第一个容器的日志
kubectl logs pod名称

# 实施追踪日志
kubectl logs -f pod名称

# 查看pod中指定容器的日志
kubectl logs -c 容器名 -f pod名称

8. 交互方式进入pod内部

# 默认进入pod内部第一个容器
kubectl exec -it nginx-1 -- /bin/bash

# 进入pod指定容器
kubectl exec -it pod名称 -c 容器名称 -- bash

9. 如果pod故障pending,查看原因

kubectl describe pod pod名字 -n 命名空间。

(四) pod多容器

1. 创建 pod

  • ① 创建 nginx-redis-pod.yml资源清单文件
  • ② 编写资源清单
apiVersion: v1
kind: Pod
metadata:
  name: nginx-redis-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
      - containerPort: 80
  - name: redis
    image: redis:5
    ports:
      - containerPort: 6379
  • ③ 创建pod
kubectl apply -f nginx-redis-pod.yml

2. 查看pod内部指定容器日志

# 查看日志 (默认只查看第一个容器日志,这里是展示 nginx 日志)
kubectl logs -f myapp

# 查看 pod 中指定容器的日志
kubectl logs -f myapp -c nginx(容器名称)
kubectl logs -f myapp -c redis(容器名称)

3. 进入pod内部指定容器

# 进入 pod 的容器 (默认进入第一个容器内部,这里会进入 nginx 容器内部)
kubectl exec -it myapp -- sh

# 进入 pod 中指定容器内部
kubectl exec -it myapp -c nginx -- sh
kubectl exec -it myapp -c redis -- sh