安装部署k8s集群

系统: CentOS Linux release 7.9.2009 (Core)

  • 准备3台主机
192.168.44.148 k8s-master
92.168.44.154 k8s-worker01
192.168.44.155 k8s-worker02
  • 3台主机准备工作
    关闭防火墙和selinux

    复制代码
      systemctl disable firewalld --now
      setenforce 0
      sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

    关闭swap分区(swap分区会降低性能,所以选择关闭)

    参考如下链接:

    复制代码
      https://blog.csdn.net/dejunyang/article/details/97972399

    设置node的主机名,并配置/etc/hosts (这样可以方面看到pod调度到哪个node上面)
    对应的node配置对应的主机名

    复制代码
      hostnamectl set-hostname k8s-master
      hostnamectl set-hostname k8s-worker01
      hostnamectl set-hostname k8s-worker02

    每台node主机都需要执行

    复制代码
      cat >> /etc/hosts << EOF 
      192.168.44.148  k8s-master
      192.168.44.154  k8s-worker01
      192.168.44.155  k8s-worker02
      EOF
  • 开始安装k8s

  1. 配置yum源(3台主机都需要操作,使用阿里云yum仓库)

    复制代码
    cat >  /etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
            http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
  2. 安装 kuberneters组件(所有节点安装)

    复制代码
    yum -y install kubeadm-1.19.0 kubectl-1.19.0 kubelet-1.19.0 --disableexcludes=kubernetes
  • --disableexcludes=Kubernetes 禁掉除了这个kubernetes之外的别的仓库
  • 这里安装的是指定版本,不指定版本默认安装最新版本
  1. kubelet服务,启动并设置开启自启(所有node执行)

    复制代码
    systemctl enable kubelet --now
  2. 所有节点安装docker

    复制代码
    yum install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum -y install docker-ce-19.03.10-3.el7 docker-ce-cli-19.03.10-3.el7 containerd.io docker-compose-plugin

    note: K8s使用的是1.19.0版本,官网推荐docker 版本 19.03

    启动,并自启docker

    复制代码
    systemctl enable docker --now

    Docker配置镜像仓库,并修改cgroup驱动为systemd(所有node节点执行)

    Cgroups概念  cgroups 的全称是 Linux Control Groups,主要作用是限制、记录和隔离进程组(process

    groups)使用的物理资源(cpu、memory、IO 等)。

    systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups,

    用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况。

    由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装kubernetes, 我们推荐使用

    systemd 驱动,不推荐 cgroupfs 驱动。

    复制代码
    cat > /etc/docker/daemon.json << EOF
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://l72pvsl6.mirror.aliyuncs.com"],
    "log-opts": {"max-size":"50M","max-file":"3"}
    }
    EOF
  • "exec-opts": ["native.cgroupdriver=systemd"] 设置cgroup驱动为systemd
  • "registry-mirrors": ["https://l72pvsl6.mirror.aliyuncs.com"] 设置docker镜像仓库为阿里云镜像
  • "log-opts": {"max-size":"50M","max-file":"3"} 设置docker容器日志最大为50M,最大文件个数为 3
  1. 允许 iptables 检查桥接流量

    若要显式加载此模块,请运行 sudo modprobe br_netfilter 通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块是否已加载

    复制代码
     sudo modprobe br_netfilter
     lsmod | grep br_netfilter

    为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

    复制代码
     cat > /etc/modules-load.d/k8s.conf << EOF
      overlay
      br_netfilter
     EOF
    
     modprobe overlay
     modprobe br_netfilter

    设置所需的 sysctl 参数,参数在重新启动后保持不变

    复制代码
     cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
     net.bridge.bridge-nf-call-iptables  = 1
     net.bridge.bridge-nf-call-ip6tables = 1
     net.ipv4.ip_forward                 = 1
     EOF

    加载sysctl参数(重启也能生效)

    复制代码
     sysctl --system
  2. 修改kubeadm的默认配置

    复制代码
    kubeadm config print init-defaults > init-config.yaml     将kubeadm默认的配置保存在文件中,到时候导入配置文件初始化集群

    修改init-config.yaml(只修改几个关键的部分)

    复制代码
    advertiseAddress: 192.168.44.148
    imageRepository: registry.aliyuncs.com/google_containers
    networking:
     dnsDomain: cluster.local
     serviceSubnet: 10.96.0.0/12
     podSubnet: 192.168.0.0/16 

    note:

  • advertiseAddress master 与集群通信的ip

  • imageRepository: registry.aliyuncs.com/google_containers 镜像仓库地址

  • networking 下面只添加了 podSubnet: 192.168.0.0/16 这个参数,其他都是默认;待会要修改CNI文件子网范围和这个一致

    查看需要拉取的镜像

    复制代码
    kubeadm config images list --config=init-config.yaml

    拉取镜像

    复制代码
    kubeadm config images pull --config=init-config.yaml
  1. 运行kubeadm init 命令安装master 节点

    复制代码
    kubeadm init --config=init-config.yaml

note: 可以忽略如下信息

W0131 16:57:45.102290 3727 configset.go:348] WARNING: kubeadmcannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
Your Kubernetes control-plane has initialized successfully! 代表控制平面初始化成功

  1. 为kubectl 配置证书才能访问master

    非root用户配置:

    复制代码
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    root用户配置:

    复制代码
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    source /etc/profile
  2. 将节点加入到k8s集群

    当然,当集群已经成功初始化完成都,最下方会打印出加入集群的代码:

    kubeadm join 192.168.44.148:6443 --token abcdef.0123456789abcdef

    --discovery-token-ca-cert-hash sha256:88eb2767faaad801ce07501946b510d20bc180fd20cf35c9aa1822b3b345c2ef

    获取加入node节点的token(master节点执行)

    复制代码
    kubeadm token list

    获取 --discovery-token-ca-cert-hash 值

    复制代码
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

    固定格式是(注意换成自己的token和hash值):

    复制代码
    kubeadm join 192.168.44.148:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:88eb2767faaad801ce07501946b510d20bc180fd20cf35c9aa1822b3b345c2ef

    如果token过期了,可以在master节点上运行

    复制代码
    kubeadm token create

    打印加入节点的完整命令可以运行

    复制代码
    kubeadm token create --print-join-command

    在所有node节点执行 加入集群的token
    根据自己对应的加入集群的token

    复制代码
    kubeadm join 192.168.44.148:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:88eb2767faaad801ce07501946b510d20bc180fd20cf35c9aa1822b3b345c2ef

    在master节点使用 kubectl get pod -A 查看所有组件是否安装成功,状态是否Runting(需要等待一会)

    复制代码
    kubectl  get pod -A
    powershell 复制代码
    	NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
    kube-system   coredns-6d56c8448f-hsm4m             0/1     Pending   0          16m
    kube-system   coredns-6d56c8448f-z66pp             0/1     Pending   0          16m
    kube-system   etcd-k8s-master                      1/1     Running   0          16m
    kube-system   kube-apiserver-k8s-master            1/1     Running   0          16m
    kube-system   kube-controller-manager-k8s-master   1/1     Running   0          16m
    kube-system   kube-proxy-447d7                     1/1     Running   0          119s
    kube-system   kube-proxy-9gt2z                     1/1     Running   0          16m
    kube-system   kube-proxy-s9hbb                     1/1     Running   0          114s
    kube-system   kube-scheduler-k8s-master            1/1     Running   0          16m

    在master节点使用查看所有节点信息

    复制代码
    kubectl get nodes
    powershell 复制代码
    	NAME           STATUS     ROLES    AGE     VERSION
    k8s-master     NotReady   master   17m     v1.19.0
    k8s-worker01   NotReady   <none>   2m48s   v1.19.0
    k8s-worker02   NotReady   <none>   2m43s   v1.19.0

    note:Node节点状态显示 NotReady 因为 还没有安装 CNI(容器网络接口)

  3. 安装Calico CNI网络插件(在master节点执行)
    下载资源文件

    复制代码
    curl -O https://docs.tigera.io/archive/v3.18/manifests/calico.yaml

    修改一下pod网段

    安装

    复制代码
    kubectl apply -f calico.yaml

    等待一会再次查看pod,node详情

    复制代码
    kubectl get nodes,pod -A
    powershell 复制代码
    	NAME                STATUS   ROLES    AGE   VERSION
    node/k8s-master     Ready    master   36m   v1.19.0
    node/k8s-worker01   Ready    <none>   21m   v1.19.0
    node/k8s-worker02   Ready    <none>   21m   v1.19.0
    
    NAMESPACE     NAME                                           READY   STATUS             RESTARTS   AGE
    kube-system   pod/calico-kube-controllers-56c7cdffc6-frc82   0/1     CrashLoopBackOff   6          13m
    kube-system   pod/calico-node-7rxzn                          1/1     Running            0          13m
    kube-system   pod/calico-node-dbjhv                          1/1     Running            0          13m
    kube-system   pod/calico-node-fsw2d                          1/1     Running            0          13m
    kube-system   pod/coredns-6d56c8448f-hsm4m                   0/1     Running            0          36m
    kube-system   pod/coredns-6d56c8448f-z66pp                   0/1     Running            0          36m
    kube-system   pod/etcd-k8s-master                            1/1     Running            0          36m
    kube-system   pod/kube-apiserver-k8s-master                  1/1     Running            0          36m
    kube-system   pod/kube-controller-manager-k8s-master         1/1     Running            0          36m
    kube-system   pod/kube-proxy-447d7                           1/1     Running            0          21m
    kube-system   pod/kube-proxy-9gt2z                           1/1     Running            0          36m
    kube-system   pod/kube-proxy-s9hbb                           1/1     Running            0          21m
    kube-system   pod/kube-scheduler-k8s-master                  1/1     Running            0          36m

    目前来看node节点已经就绪了,但是有一个pod报错,2个pod没有准备好,使用kubectl --namespace=kube-system describe pod pod名称 查看pod的事件

    复制代码
    kubectl --namespace=kube-system describe pod calico-kube-controllers-56c7cdffc6-frc82

    报错问题能力有限无法处理,部署基本都是这样。组要是版本差异然后不知道怎么处理!!!

    如果知道是什么原因导致的报错,还请不吝赐教。

相关推荐
赴前尘21 小时前
k8s 部署 redis
k8s
zyplanke2 天前
Kubernetes(四):Service
云原生·容器·kubernetes·k8s
Nazi62 天前
sealos部署k8s
运维·kubernetes·k8s
伟大的大威4 天前
K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案
k8s·cpu
听说唐僧不吃肉6 天前
DevOps篇之通过GitLab CI 流水线实现k8s集群中helm应用发布
k8s·devops
java资料站9 天前
k8s集群1.20.9
k8s·kubelet
退役小学生呀13 天前
十九、云原生分布式存储 CubeFS
分布式·docker·云原生·容器·kubernetes·k8s
久绊A13 天前
Minikube win安装步骤
k8s
照物华16 天前
深入理解Kubernetes核心:标签与标签选择器实战解析
云原生·容器·kubernetes·k8s
裸奔的大金毛16 天前
K8S - NetworkPolicy的使用
容器·kubernetes·k8s