美文网首页
Centos7 搭建 k8s(v1.28)环境以及架构简介

Centos7 搭建 k8s(v1.28)环境以及架构简介

作者: wayyyy | 来源:发表于2023-12-31 03:37 被阅读0次

    重要的概念

    搭建之前我们先理解几个概念:

    Cluster

    Cluster 是计算,网络,存储资源的集合。

    Master

    Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行,为了实现高可用,可以运行多个Master。

    Node

    Node 的职责是运行容器的应用,Node 由 Master 管理,Node 负责监控并汇报容器的状态,同时根据Master 的要求管理容器的生命周期。

    Pod

    Pod 是 k8s 的最小工作单元,每个Pod包含了一个或多个容器,Pod 中的容器会作为一个整体备 Master 调度到一个Node上运行。

    • 为什么引入Pod ?
    Controller
    Service
    Namespace

    部署k8s

    计划部署3节点的k8s cluster,部署模型如图:

    image.png

    viros1 作为 master,viros2 和 viros3 作为剩下的节点。

    安装docker

    所有节点上都需要安装docker。这里参见:docker-ce 的安装与卸载

    注意,安装完成后,还需要,修改docker-ce默认配置为systemd,以及修改为国内官方镜像源。

    # cat > /etc/docker/daemon.json << EOF 
    {
      "storage-driver": "overlay2",
      "exec-opts": ["native.cgroupdriver=systemd"],
      "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
    }
    EOF
    
    # systemctl restart docker
    
    一些配置

    所有节点,需要执行:

    • 设置3个节点/etc/hosts,以及ssh免密登录
      参考:https://www.jianshu.com/p/791cc53d7951

    • 关闭防火墙
      参考:https://www.jianshu.com/p/791cc53d7951

    • 关闭SELINUX
      参考:https://www.jianshu.com/p/791cc53d7951

    • 关闭swap分区
      参考:https://www.jianshu.com/p/5c039215992a

    • 启用网桥过滤模块

      # modprobe br_netfilter
      

      查看是否加载成功:

      # lsmod | grep br_netfilter
      
      image.png

      为什么要启用br_netfilter,参考:k8s中为什么需要br_netfilter与net.bridge.bridge-nf-call-iptables=1

    • 加载ipvs等模块
      在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。

      • 安装ipset和ipvsadm
        # yum install ipset ipvsadm -y
        
      • 添加需要加载的模块写入脚本文件
        # cat > /etc/sysconfig/modules/ipvs.modules <<EOF
        modprobe -- ip_vs
        modprobe -- ip_vs_rr
        modprobe -- ip_vs_wrr
        modprobe -- ip_vs_sh
        modprobe -- nf_conntrack_ipv4
        EOF
        
        # /bin/bash /etc/sysconfig/modules/ipvs.modules
        
        查看模块是否加载:
        # lsmod | grep -e ip_vs -e nf_conntrack_ipv4
        
        image.png
    • 调整内核参数

      # cat > /etc/sysctl.d/kubernetes.conf <<EOF
      net.bridge.bridge-nf-call-iptables=1
      net.bridge.bridge-nf-call-ip6tables=1
      net.ipv4.ip_forward=1      # 开启ip转发
      net.ipv4.tcp_tw_recycle=0  # 关闭快速回收处于TIME_WAIT状态的socket
      net.ipv6.conf.all.disable_ipv6=1  # 禁用ipv6
      vm.swappiness=0            # 禁止使用 swap 空间, 只有当系统 OOM 时才允许使用它
      vm.overcommit_memory=1     # 不检查物理内存是否够用
      vm.panic_on_oom=0          # 内存不足时, 启动 OOM killer
      EOF
      
      # sysctl -p /etc/sysctl.d/kubernetes.conf
      

      net.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1 参考:k8s 中为什么要开启bridge-nf-call-iptables

    添加ali k8s repo 源
    # cat <<EOF > /etc/yum.repos.d/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
    
    # yum makecache
    
    安装kubelet,kubeadm ,kubectl

    kubelet 运行在cluster所有节点上,负责启动Pod和容器,kubeadm 用于初始化 cluster,kubectl 是 k8s 的命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新各种组件。

    # yum install kubelet kubeadm kubectl
    # systemctl enable kubelet 
    
    用 kubeadm 创建 cluster

    如果想重新初始化则执行:kubeadm reset

    下面开始初始化cluster:

    kubeadm init \
    --apiserver-advertise-address=192.168.48.20 
    --image-repository registry.aliyuncs.com/google_containers
    

    遇到报错:


    image.png

    然后参考:https://www.cnblogs.com/xlei/p/16999271.html 执行命令解决:

    # rm -rf /etc/containerd/config.toml 
    # systemctl restart containerd
    

    继续报错:


    image.png

    这是因为国内连接不上registry.k8s.io,因为我有proxy,所以修改 /usr/lib/systemd/system/containerd.service ,加上proxy:

    [Service]
    Environment="http_proxy=http://192.168.48.1:7890"
    Environment="https_proxy=http://192.168.48.1:7890"
    ...
    
    image.png

    再执行:systemctl daemon-reload && systemctl restart containerd

    kubeadm init 之后:


    image.png

    master 节点编辑/etc/profile,加入:

    export KUBECONFIG=/etc/kubernetes/admin.conf
    

    再执行source /etc/profile

    再再俩从节点上执行:

    kubeadm join 192.168.48.20:6443 --token o5t82v.8zvsvsc273meng2y \
        --discovery-token-ca-cert-hash sha256:7192b77a8696565ace34a6d6a8f03303d1debafe70d543529af899fab6c52138
    

    如果不小心清屏,那么可以再执行 kubeadm token create --print-join-command 查看token。

    此时,我们3个节点集群已经初步ok,再master节点上执行kubectl get nodes,可以查看:

    image.png
    master 节点配置网络,使用Calico
    curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
    

    编辑 calico.yaml 文件,如图所示,新增加:

    - name: IP_AUTODETECTION_METHOD
      value: "interface=ens33"
    
    image.png

    ens33 为 192.168.48.20 所在的网卡

    执行:

    # kubectl apply -f calico.yaml
    

    部署的时候calico 一直报奇奇怪怪的错误,好像是去连接了代理去通信,把上面步骤 /usr/lib/systemd/system/containerd.service 中加入的proxy注释掉后,calico 安装成功。


    image.png
    k8s contaired docker 之前的关系

    查看node上的所使用的container runtime:


    image.png

    我这里安装的k8s 是v1.28.4 版本,已经将容器运行时改为 contaired(不是docker),所以这么多pod在运行,我输入 docker ps 却看不到一个在运行的容器,那么怎么查看contaired上运行的容器呢?

    # crictl config runtime-endpoint unix:///run/containerd/containerd.sock
    # crictl ps
    
    image.png

    所以,再回来审视我们的安装步骤,理论上来说已经不需要安装docker了,而是需要安装 contaired,但是安装docker 好像会安装上contaired。

    关于 k8s docker contaired 关系可以查看:https://zhuanlan.zhihu.com/p/494054143


    运行一个demo

    创建Namespace:

    # cat > ns-nginx.yml << EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: nginx
      labels:
        name: nginx
    
    EOF
    
    # kubectl create -f ns-nginx.yml
    

    查看刚才创建的命名空间:

    # kubectl get namespaces
    
    image.png

    部署nginx 应用

    # cat > nginx.yml << EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment1
      namespace: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx-demo
            image: nginx:1.14.0
            ports:
            - containerPort: 80
          
    EOF
    
    # kubectl create -f nginx.yml
    

    查看 namesapce 为nginx 下的 pods

    # kubectl get pods -n nginx
    
    image.png

    查看我们定义的deployment

    # kubectl get deployment -n nginx
    
    image.png

    在上面我们定义了2个副本,执行如下命令课查看pod分别被调度到了哪些节点上。

    kubectl get pods -n nginx -o wide
    
    image.png

    卸载k8s

    TODO

    k8s 架构组成简介


    参考资料
    1、https://learnku.com/docs/go-micro-build/1.0/kubernetes-1804-cluster-installation-tutorial-based-on-centos7/8877
    2、https://www.cnblogs.com/Fzeng/p/17288286.html
    3、http://123.57.207.179/article_detail/1646098660465628
    4、https://blog.csdn.net/axibazZ/article/details/119301373

    相关文章

      网友评论

          本文标题:Centos7 搭建 k8s(v1.28)环境以及架构简介

          本文链接:https://www.haomeiwen.com/subject/yrrendtx.html