k8s学习

Sabthever

一. 介绍

  kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。[1]

  详细作用有:

  1. 容器编排
  • 自动化部署:k8s 可以自动部署容器化应用程序到集群中的节点上,无需手动干预。
  • 自动扩展:根据应用程序的负载自动扩展或缩减容器的数量,以满足业务需求。
  • 自动重启:在容器失败或节点宕机时,自动重启容器或重新调度到其他健康节点上。
  1. 服务发现和负载均衡
  • 服务发现:k8s 提供内置的服务发现机制,使得容器间可以方便地通信。
  • 负载均衡:自动在多个容器间分配流量,确保应用程序的高可用性和性能。
  1. 存储编排
  • 动态存储管理:支持动态分配和管理存储卷,适用于有状态应用程序的数据存储需求。
  • 多种存储支持:可以与多种存储后端(如本地存储、云存储等)集成。
  1. 配置和密钥管理
  • 集中配置管理:将应用程序的配置与镜像分离,方便统一管理和更新。
  • 安全密钥管理:安全地存储和管理敏感信息(如密码、密钥等),并将其注入到容器中。
  1. 资源管理
  • 资源调度:根据资源需求(如 CPU、内存)智能调度容器到合适的节点上。
  • 资源配额:限制资源使用,避免单个应用程序占用过多资源影响其他应用。
  1. 高可用性和容错性
  • 多副本运行:通过运行多个副本确保服务的高可用性。
  • 自我修复:自动检测和替换不健康的容器或节点,确保系统始终处于期望状态。
  1. 滚动更新和回滚
  • 平滑更新:支持滚动更新,逐步替换旧版本容器,避免服务中断。
  • 快速回滚:如果更新出现问题,可以快速回滚到之前的稳定版本。
  1. 跨环境一致性和移植性
  • 环境一致性:在开发、测试和生产环境中保持一致的部署体验。
  • 云移植性:支持在多种云平台(如 AWS、Azure、GCP)和本地数据中心之间移植应用程序。
  1. 多租户支持
  • 资源隔离:在共享集群中,能够隔离不同租户的资源,确保安全性和性能。
  • 命名空间管理:使用命名空间对资源进行逻辑隔离,方便多团队或项目管理。

二.k8s部署

  这里主要配置的k8s三台设备的集群,是终端型k8s(无UI),在三台Centos7环境下进行配置,本篇部署参考[2]《适合新手的K8s完整部署教程》。这边是在相应虚拟机里进行部署,需要一定的Linux基础,并且是在学习环境中的(局域网中),生产环境的话要打通相应的网络,做好防护。

  1. yum换源

    需要给Centos7提前换源,否则会失败,换源方法自己查查,具体有wget下载、网上下载导入等方法。有wget可以直接执行如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 备份原来镜像源
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

    # 更换阿里云的镜像源
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

    # 构建yum 元数据缓存
    yum clean all
    yum makecache
  2. 初始化相应CentOS7配置,固定好IP并改好DNS

    进入`/etc/sysconfig/network-scripts/ifcfg-ens33``

    ``BOOTPROTO改为“static”`

    IPADDR改为自己的ip地址

    配置好相应DNS和网关

  3. 做好IP映射

    进入/etc/hosts,把三台设备的路由跟在后面,如我本地

    1
    2
    3
    192.168.179.150 k8s01
    192.168.179.151 k8s02
    192.168.179.152 k8s03

    其中150的是我的master机器。

  4. 三台机器需要执行以下操作(非生产环境)

    1
    2
    3
    4
    5
    6
    7
    # a:安装epel-release源
    yum -y install epel-release

    # b:关于防火墙和selinx,避免与docker容器的防火墙规则出现冲突
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
  5. 开始部署master主机,可随意选择一台作为根主机

    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
    # a:安装etcd和kubernetes-master
    yum install etcd
    yum install kubernetes-master

    # b:编辑/etc/etcd/etcd.conf文件
    vi /etc/etcd/etcd.conf
    # 编辑如下:
    ETCD_NAME=default
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"

    # c:编辑/etc/kubernetes/apiserver文件
    vi /etc/kubernetes/apiserver
    # 编辑如下:  
    KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
    KUBE_API_PORT="--port=8080"
    KUBELET_PORT="--kubelet-port=10250"
    KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
    KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
    KUBE_ADMISSION_CONTROL="--admission-         control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
    KUBE_API_ARGS=""

    # d:启动并设置开机启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler等服务
    for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
    done
    # 这段代码需完整复制到命令行进行执行

    # e:etcd中定义flannel网络
    etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
  6. 以下操作在node1和node2节点进行操作

    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
    # 1、yum安装flannel和kubernetes-node
    yum install -y flannel
    yum install -y kubernetes-node

    # 2、为flannel网络指定etcd服务
    # a:修改 /etc/sysconfig/flanneld文件
    vi /etc/sysconfig/flanneld
    #修改如下(如果没有的话就新增上去):
    FLANNEL_ETCD="http://192.168.179.150:2379"
    FLANNEL_ETCD_KEY="/atomic.io/network"
    # 注意:这里的192.168.179.150是我们的master主机的IP

    # b:修改/etc/kubernetes/config文件  
    vi /etc/kubernetes/config
    #修改如下:
    KUBE_LOGTOSTDERR="--logtostderr=true"
    KUBE_LOG_LEVEL="--v=0"
    KUBE_ALLOW_PRIV="--allow-privileged=false"
    KUBE_MASTER="--master=http://192.168.179.150:8080"

    # c:修改对应node的配置文件/etc/kubernetes/kubelet
    #Node1的修改如下:
    KUBELET_ADDRESS="--address=0.0.0.0"
    KUBELET_PORT="--port=10250"
    KUBELET_HOSTNAME="--hostname-override=192.168.179.151" #修改成Node1的IP
    KUBELET_API_SERVER="--api-servers=http://192.168.179.150:8080" #指定Master节点的 API Server
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    KUBELET_ARGS=""

    # Node2:修改如下:
    KUBELET_ADDRESS="--address=0.0.0.0"
    KUBELET_PORT="--port=10250"
    KUBELET_HOSTNAME="--hostname-override=192.168.179.152" #修改成Node2的IP
    KUBELET_API_SERVER="--api-servers=http://192.168.179.150:8080" #指定Master节点的 API Server
    KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
    KUBELET_ARGS=""


    # 3、在Node1和Node2上同时执行以下代码进行启动kube-proxy,kebelet,docker,flanneld等服务,并且设置开机启动
    for SERVICES in kube-proxy kubelet docker flanneld; do
    systemctl restart $SERVICES
    systemctl enable $SERVICES
    systemctl status $SERVICES
    done
    # 以上代码需要复制到命令行中完整执行
  7. 进行验证

    在Master节点上执行

    kubectl get node

    出现如下内容,表示部署完毕。

    image-20250428095133431

  8. 部署完毕

三. k8s使用

kubectl是控制k8s集群的命令。

常规操作

  • 查看集群信息
    • kubectl cluster-info:查看集群的主节点信息等。
  • 获取资源列表
    • kubectl get <资源类型>:查看指定资源的列表。例如:
      • kubectl get nodes:查看节点列表。
      • kubectl get pods:查看 Pod 列表。
      • kubectl get services:查看服务列表。
      • kubectl get deployments:查看部署列表。
      • kubectl get all:查看所有资源。
  • 查看资源详细信息
    • kubectl describe <资源类型> <资源名称>:查看指定资源的详细信息。例如:
      • kubectl describe pod :查看 Pod 的详细信息。
      • kubectl describe node :查看节点的详细信息。
  • 创建资源
    • kubectl create -f <文件路径>:根据 YAML 文件创建资源。
  • 删除资源
    • kubectl delete <资源类型> <资源名称>:删除指定资源。例如:
      • kubectl delete pod :删除 Pod。
      • kubectl delete deployment :删除部署。
    • kubectl delete -f <文件路径>:根据 YAML 文件删除资源。

Pod 操作

  • 进入 Pod
    • kubectl exec -it -- /bin/shkubectl exec -it -- /bin/bash:进入 Pod 的 Shell。
  • 查看 Pod 日志
    • kubectl logs :查看 Pod 的日志。
    • kubectl logs -f :实时查看 Pod 的日志。

部署操作

  • 更新部署
    • kubectl set image deployment/ <容器名称>=<新镜像>:更新部署中的镜像。
  • 查看部署状态
    • kubectl rollout status deployment/:查看部署的更新状态。

服务操作

  • 查看服务
    • kubectl get svc:查看服务列表。
  • 访问服务
    • kubectl port-forward svc/<服务名称> <本地端口>:<服务端口>:将服务端口转发到本地端口。

命名空间操作

  • 查看命名空间
    • kubectl get namespaces:查看命名空间列表。
  • 切换命名空间
    • kubectl config set-context --current --namespace=<命名空间名称>:切换到指定的命名空间。

详情学习请参考[3]《K8S详解(5万字详细教程)》

四. 基于k8s的后端开发

(尽请期待)

参考资料


[1] K8s简介

[2]《适合新手的K8s完整部署教程》

[3]《K8S详解(5万字详细教程)》

以上文献

最后

  • 标题: k8s学习
  • 作者: Sabthever
  • 创建于 : 2025-04-28 08:57:10
  • 更新于 : 2025-08-01 09:36:14
  • 链接: https://sabthever.cn/2025/04/28/technology/operation/k8s学习/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。