美文网首页
Kubernetes集群安装教程-Ubuntu22.04

Kubernetes集群安装教程-Ubuntu22.04

作者: 轻轻敲醒沉睡的心灵 | 来源:发表于2024-08-02 17:16 被阅读0次

    安装k8s集群,需要先安装3个软件:kubectl(命令行接口)、kubeadm(集群管理命令工具)和kubelet

    首先我们准备环境,以1个master和2个node节点为例。

    hostname 系统 配置 IP 组件
    vm21 ubuntu22.04 2核4G 10.10.1.21 contrainerd,kubectl,kubeadm,kubelet
    vm22 ubuntu22.04 2核2G 10.10.1.22 contrainerd,kubectl,kubeadm,kubelet
    vm23 ubuntu22.04 2核2G 10.10.1.23 contrainerd,kubectl,kubeadm,kubelet

    1. 系统设置

    系统设置部分,3台机器都要

    1.1 设置root账号密码

    sudo passwd root
    # 输入现在的账号密码,然后设定root账号密码
    # 切换到 root
    su
    

    1.2 安装ssh,开启root登陆

    apt install openssh-server
    apt install vim 
    # 修改配置
    vim /etc/ssh/sshd_config 
    # PermitRootLogin 选项去掉注释,改成yes:PermitRootLogin yes
    

    1.3 修改安装源

    用root账号登陆后。
    参考 阿里云 教程:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.7e311b11FgNIod

    vim /etc/apt/sources.list
    # 替换成下面的:
    deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    
    deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
    
    deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    
    # deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    # deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
    
    deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    
    # 更新系统
    apt update
    apt upgrade
    

    1. 4 主机名解析,修改host,注意和主机hostname一样

    vim /etc/hosts
    # 添加下面的,注意原来有的1个删了
    10.10.1.21 vm21
    10.10.1.22 vm22
    10.10.1.23 vm23
    
    hosts

    1.5 配置时间同步

    apt-get install ntpdate
    # 设置阿里云时间服务器
    ntpdate time1.aliyun.com
    

    1.6 关闭防火墙

    systemctl stop ufw
    systemctl disable ufw
    

    1.7 关闭selinux

    vim /etc/selinux/config
    # 写入以下配置,保存退出
    SELINUX=disabled
    # 最后重启,检查
    reboot
    apt install selinux-utils
    getenforce
    

    1.8 禁用swap分区

    vim /etc/fstab
    # 注释掉 /swapfile     none     swap    sw     0     0这一行
    #/swapfile     none     swap    sw     0       0
    # 重启系统
    reboot
    # 检查
    free -m
    
    swap

    1.9 配置网桥和内核转发

    # 1.
    cat << EOF | tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
    # 2. 上面配置会开机自启,现在也开启
    modprobe overlay
    modprobe br_netfilter
    # 3. 查看
    lsmod | egrep "overlay"
    lsmod | egrep "br_netfilter"
    # 4. 网桥过滤和内核转发追加到 k8s.conf 文件
    cat << EOF | tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    # 5. 加载内核参数
    sysctl --system
    # 6. 查看
    sysctl -a | grep ip_forward
    
    网桥
    转发

    1.10 配置ipvs功能

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

    apt-get install ipset ipvsadm
    # 配置 ipvsadm 模块启动时自动加载
    cat << EOF | tee /etc/modules-load.d/ipvs.conf
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    EOF
    # 重启
    reboot
    # 检查
    lsmod | grep ip_vs
    
    image.png

    1.11 安装Docker

    用脚本自动安装的,参考的 南京大学的 开源镜像帮助文档:
    https://mirror.nju.edu.cn/mirrorz-help/docker-ce/?mirror=NJU
    其实,清华大学的帮助文档也有,但是给的下载脚本的地址国内好像被墙了,github上的有时还能下下来,所以选的南京大学的。
    安装好以后设置开机自启:

    systemctl enable docker
    

    其实,我们可以不用docker,我们需要的是contrainerd,而安装了docker,contrainerd也就有了。
    这里注意一下:containerd的配置需要修改一下

    # 1. 生成containerd默认配置,其实现在这个文件是有的,但是内容不全
    containerd config default > /etc/containerd/config.toml
    # 2. 修改1 在60多行,sandbox_image = "registry.k8s.io/pause:3.6",改成我们kubernetes版本一致的,现在应该是3.9,后面会说怎么看。
    # 改成:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
    # 3. 修改2  在130行左右,我这127行,SystemdCgroup = false改成SystemdCgroup = true
    # 4. 直接重启吧  reboot
    

    1.12 安装3大组件-kubeadm、kubelet、kubectl

    参考阿里云给的方法:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.78ba1b119Qwd9O
    我是打算安装最新的,现在是1.30.3

    apt-get install -y apt-transport-https
    curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |
        gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
        tee /etc/apt/sources.list.d/kubernetes.list
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    

    1.13 下载所需镜像

    某些原因,镜像下载不好用,我们先用阿里云源,下载下来所需镜像。
    官方给了 查询镜像的方法:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/

    # 查询所需镜像
    kubeadm config images list
    # 查看阿里云镜像仓库地址中的镜像列表
    kubeadm config images list  --image-repository registry.aliyuncs.com/google_containers
    # 把阿里镜像源的 那 7个 拉下来 就行了,我这都能拉下来
    docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
    docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
    docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
    docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.30.3
    docker pull registry.aliyuncs.com/google_containers/coredns:v1.11.1
    docker pull registry.aliyuncs.com/google_containers/pause:3.9
    docker pull registry.aliyuncs.com/google_containers/etcd:3.5.12-0
    
    镜像
    1722586005911.png

    2. 安装Kubernetes集群

    2.1 集群初始化 -- 仅对master节点

    使用kubeadm初始化集群

    cd /
    # 生成kubeadm默认配置文件
    kubeadm config print init-defaults > kubeadm-config.yaml
    # 2. 修改默认配置
    vim kubeadm-config.yaml
    
    • ip修改为我们master节点ip:localAPIEndpoint.advertiseAddress: 10.10.1.21
    • 修改名称:nodeRegistration.name: vm21
    • 镜像源修改为阿里的:imageRepository: registry.aliyuncs.com/google_containers
    • kubernetesVersion修改:kubernetesVersion: 1.30.3
    • 添加networking.podSubnet:networking.podSubnet: 10.244.0.0/16
    • 文件末尾添加cgroup(有分隔符):
      ---
      kind: KubeletConfiguration
      apiVersion: kubelet.config.k8s.io/v1beta1
      cgroupDriver: systemd
      

    上面已经下载好镜像了,初始化配置文件也修改了,进行初始化:

    # 初始化命令
    kubeadm init --config kubeadm-config.yaml
    
    初始化成功

    初始化成功以后,需要配置一下系统,截图上已经给了,上面还给出了其他节点加入集群的命令,要记录下来用。我是root,但也执行了这个:

    # 主要是吧 命令加到环境变量中,不然kubectl命令报错
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
     export KUBECONFIG=/etc/kubernetes/admin.conf
    

    初始化以后,查看节点和pod是这样的。

    kubectl get nodes
    kubectl get pod -A
    
    1722589125196.png

    2.2 添加node节点

    上面初始化时已经生成了加入命令了(不记得了用这个生成:kubeadm token create --print-join-command),我们只需要在node节点执行就可以了
    分别在另外2台机器执行:

    kubeadm join 10.10.1.21:6443 --token 42hek0.a24j8outjbvv7lkg --discovery-token-ca-cert-hash sha256:d038e3cf2d2af889bf43f3fcdf70f028f014c3bc26a1784d76b248b070bf8e41
    
    image.png

    修改一下节点角色,master执行:

    kubectl label node vm22 node-role.kubernetes.io/worker=worker
    kubectl label node vm23 node-role.kubernetes.io/worker=worker
    
    image.png

    3. 安装网络插件

    从上面pod可以看见,coredns 停滞在 Pending 状态。这是正常的。
    官网是这么说的:这一行为是预期之中的,因为系统就是这么设计的。kubeadm 的网络供应商是中立的, 因此管理员应该选择安装 Pod 的网络插件。 你必须完成 Pod 的网络配置,然后才能完全部署 CoreDNS。 在网络被配置好之前,DNS 组件会一直处于 Pending 状态。

    3.1 网络插件

    常见的网络插件有Flannel、Calico 、Cilium 。

    • Flannel 适合小规模集群
    • Calico 是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。既适合小规模也适合大规模,部署也比较容易。


      引自 https://blog.csdn.net/BlogPan/article/details/133513076
    • Cilium 对内核的版本要求较高,内核版本必须要达到6.3以上
      这里我们选用Calico。

    3.2 安装Calico

    Calico官网文档:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

    3.2.1 版本选择

    首先我们要查询一下和我们K8s版本对应的Calico版本。在Calico的系统需求里面能找到。Calico v3.28里面能找到K8s v1.30版本。

    3.2.2 快速安装

    然后,根据Calico的快速开始文档就可以安装了。注意,是在 master节点。文档一共5步,我们按顺序来:

      1. 配置tigera-operator命名空间
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
    
    tigera-operator
    执行完以后,可以用命令(kubectl get ns)查看到tigera-operator命名空间已经好了并且运行正常。
      1. 配置安装Calico

    下载下来custom-resources.yaml文件,将网段改成10.244.0.0/16(因为前面k8s初始化的时候设置的pod网段就是这个)。

    cd /
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
    
    cidr
    安装这个和初始化k8s差不多的,也是需要镜像。所以,我们需要先准备镜像。
    注意!注意!注意!
    反正这我是踩了一天的坑!一开始用的docker镜像,总是出问题,明明镜像在那,还说拉取不下来,一着急docker镜像删了,用ctr(contrainerd带的命令行工具)重新拉取,这才能用了。所以不要拉docker镜像了,直接ctr。
    1. 先说需要哪些镜像?7个,别问怎么知道的,4种pod节点我一个个试出来的,每次running不成功看看是什么


      4种pod
    2. 直接拉取不一定成功,先设置加速地址(不知道有没有用),然后拉取
      加速地址
      我是从这个里面挑了2个加进去了:https://github.com/DaoCloud/public-image-mirror/issues/2328
      镜像拉取命令(3个node都要拉!3个node都要拉!3个node都要拉!):
    #  node类型pod中3个
    ctr image pull docker.1panel.live/calico/cni:v3.28.1
    ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.28.1
    ctr image pull docker.1panel.live/calico/node:v3.28.1
    # node-driver类型pod中2个
    ctr image pull docker.1panel.live/calico/csi:v3.28.1
    ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.28.1
    # typha类型pod中1个
    ctr image pull docker.1panel.live/calico/typha:v3.28.1
    # controller类型pod中1个
    ctr image pull docker.1panel.live/calico/kube-controllers:v3.28.1
    # 这是后来又出现的calico-apiserver 命名空间中需要的
    ctr image pull  docker.1panel.live/calico/apiserver:v3.28.1
    
    calico镜像

    镜像拉下来以后,执行creat命令(master节点就行):

    kubectl create -f custom-resources.yaml
    
      1. 查看安装结果

    上面执行完以后,我们看一下命名空间和pod

    kubectl get ns
    kubectl get pods -A
    kubectl get nodes
    
    所有pod
    所有node

    这里补充2个实用命令:

    # 查看pod情况描述的,包含了ip和镜像以及报错的日志
    kubectl describe pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver
    # 这个是删除pod的,拉取镜像后,删除pod,会自动重建pod,就好了
    kubectl delete pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver
    

    到这里,K8s基本安装完成了,节点和pod都正常运行了。

    4. 部署nginx测试

    K8s里面有 service 的概念,service是盒一组Pod关联的。当我们部署服务以后,多了一组pod,同时也会多一个service,定义了访问服务的ip、端口等信息。
    查看命令:kubectl get service。我们先来看一下现在的:

    service
      1. 创建nginx配置文件
    vim nginx-deployment.yaml
    
      1. 添加如下配置:
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mynginx # 部署的名称
    spec:
      replicas: 2  # 设置副本数量为2
      selector:
        matchLabels:
          app: mynginx1 # 用于选择匹配的Pod标签
      template:
        metadata:
          labels:
            app: mynginx1 # Pod的标签
        spec:
          containers:
          - name: nginx # 容器名称
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败
            imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
            ports:
            - containerPort: 80 # 容器内部监听的端口
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service # 服务的名称
    spec:
      externalTrafficPolicy: Cluster # 外部流量策略设置为集群
      selector:
        app: mynginx1 # 用于选择匹配的Pod标签
      ports:
      - protocol: TCP # 使用TCP协议
        port: 80 # 服务暴露的端口
        targetPort: 80 # Pod中容器的端口
        nodePort: 30080 # 在每个Node上分配的端口,用于外部访问
      type: NodePort # 服务类型,使用NodePort
    
      1. 应用配置
    kubectl apply -f nginx-deployment.yaml
    
      1. 查看
    kubectl get pods -o wide
    kubectl get service
    
    nginx服务
      1. 访问
        访问分集群内部,外部访问,我们试一下。
        内部:curl 10.100.196.101
        内部访问
        外部,外部访问从每个节点都可以,每个节点 ip不一样,端口都是一样的:
        外部访问

    相关文章

      网友评论

          本文标题:Kubernetes集群安装教程-Ubuntu22.04

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