K8S本地化部署

1. 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7

  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

  • 集群中所有机器之间网络互通

  • 可以访问外网,需要拉取镜像

  • 禁止swap分区

本次集群由三台机器搭建

  1. k8s-master:192.168.147.131

  2. k8s-node1:192.168.147.132

  3. k8s-node2:192.168.147.133

建议升级centos7内核

  1. 更新yum源仓库

    yum -y update

  2. 安装epel最新的仓库

    导入密钥:rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    安装仓库: yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

  3. 列出可安装的系统内核相关包

    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

  4. 选择版本

    lt是长支持版本

    yum -y --enablerepo=elrepo-kernel install kernel-lt

    ml是最新稳定版本

    yum -y --enablerepo=elrepo-kernel install kernel-ml

  5. 设置默认启动项

    vim /etc/default/grub

    使GRUB_DEFAULT=0

  6. 重新生成grub配置文件

    grub2-mkconfig -o /boot/grub2/grub.cfg

  7. 重启并查看内核版本

    reboot #重启

    uname -sr #查看内核版本

2. 准备环境(master、node节点都需执行)

  1. 关闭防火墙:(nftables后端兼容性问题,产生重复的防火墙规则) systemctl stop firewalld systemctl disable firewalld

  2. 关闭selinux:关闭selinux以允许容器访问宿主机的文件系统,linux下的一个安全机制,主要是对文件系统访问做一个权限控制,这个权限控制会影响到kubernetes中的一个组件kuberlete的安装,因为这个组件的安装会访问本地的文件操作系统 setenforce 0 #临时关闭

    sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭

    vi /etc/sysconfig/selinux

    修改以下参数,设置为disable

    SELINUX=disabled

  3. 关闭swap:Kubernetes 在启用 Swap 时不知道如何处理内存驱逐,swap分区的作用是当物理内存不足时,利用swap分区做数据交换,但是在kubernetes中完全不支持swap分区

    swapoff -a #临时关闭 vi /etc/fstab #永久关闭,删除swap配置哪一行

  4. 修改主机名 方便部署时区别节点

    hostnamectl set-hostname 《hostname》

  5. 添加主机名与IP对应关系(记得设置主机名): cat /etc/hosts 192.168.147.131 k8s-master 192.168.147.132 k8s-node1 192.168.147.133 k8s-node2

  6. 将桥接的IPv4流量传递到iptables的链:有一些ipv4的流量不能走iptables链【linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理】,导致流量丢失

    cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF

  7. 使命令生效 若提示***不存在,执行 modprobe br_netfilter sysctl --system

  8. 时间同步:启动chronyd系统服务

    yum install ntpdate -y

    ntpdate time.windows.com

2.安装DOCKER(master、node节点都需执行)

  1. 安装docker

    下载docker镜像

    安装必要的系统工具

    yum install -y yum-utils device-mapper-persistent-data lvm2

    添加软件源信息

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

    安装docker

    yum makecache fast

    yum -y install docker-ce

    重启动docker,并设置开机自启

    systemctl enable docker && systemctl start docker

    查看docker版本

    docker --version

  2. 添加阿里云yum源

    cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF

3. 安装KUBEADM,KUBELET和KUBECTL(master、node节点都需执行)

kubelet: 运行在cluster所有节点上,负责启动POD和容器

kubeadm: 用于初始化cluster

kubectl: :kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

  1. 指定版本安装

    yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 systemctl enable kubelet

  2. 部署k8s初始化操作 (仅master节点执行 )

    kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.254.253.10 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

    kubernetes-version:要安装的版本
    pod-network-cidr:负载容器的子网网段
    image-repository:指定镜像仓库(由于从阿里云拉镜像,解决了k8s.gcr.io镜像拉不下来的问题)
    apiserver-advertise-address:节点绑定的服务器ip(多网卡可以用这个参数指定ip)
    v=6:用法是初始化过程显示详细内容
  3. 运行kebeadm init 初始化报错 failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0

    1. 使用docker 命令拉去镜像

      docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0

    2. 使用的docker拉取的镜像不符合k8s需要的命名,需要进行更改

      1. 重命名

        docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0

      2. 删除原有镜像

        docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0

    3. 再次运行初始化命令

  4. 使用kubectl工具

    mkdir -p $HOME/.kube

    sudo cp -i /etc/kubernetes/admin.conf

    HOME/.kube/config sudo chown $(id -u):

    (id -g) $HOME/.kube/config

     

    查看启动节点

    kubectl get nodes

4. 安装POD网络插件( CNI )(master、node节点都需执行)

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml(需科学性上网拉取)

    或在yaml文件的image属性值改成国内 lizhenliang/flannel:v0.11.0-amd64 镜像

    或到 http://ip.tool.chinaz.com/ 查询 raw.githubusercontent.com/coreos 的IP 地址

    把查询到的地址添加到 /etc/hosts做主机ip映射

  2. 安装POD网络插件报 The connection to the server localhost:8080 was refused - did you specify the right host or port?

    需设置环境变量

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

    source /etc/profile

  3. 安装flannel网络创建报The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

    原因外网不能使用

    解决办法
    # 在https://www.ipaddress.com/查询raw.githubusercontent.com的真实IP。
    vim /etc/hosts
    185.199.108.133 raw.githubusercontent.com
  4. 使用查看kube-flannel是否为running状态

    kubectl get pods -n kube-system

  5. 让Node节点添加到master节点中

    由master节点执行kubeadm init 生成的最后生成的token 复制到node节点

    添加之前,先在node节点执行 kubeadm reset命令

    例:kubeadm join 192.168.147.128:6443 --token rm1llx.6cuij6c60fhdfwd1 --discovery-token-ca-cert-hash sha256:62d9066bcbd7f0aa77e49a3d0b484d1640bf01ac8c2f99b1e0bc68839b24692d

  6. 重新生成token (master执行)

    kubeadm token create --print-join-command

  7. pod的kube-flannel-ds-*** 的STATUS为init:ImagePullBackOff

    https://github.com/flannel-io/flannel/releases 下载日志中缺少的flanneld的版本

  8. 通过xftp导入到docker中运行

    例:docker pull flanneld-v0.14.0-amd64.docker

  9. 通过 kubectl get pods -n kube-system 查看pods状态是否正常

测试K8S集群 (master执行)

在k8s集群中插件一个pod验证是否正常

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort(type=NodePort 设置为外部暴露)

kubectl get pod,svc

通过查询出来的端口配合node节点的ip在外部浏览器进行访问 出现nginx的信息即可

 

部署 Dashboard(master执行)

Kubernetes Dashboard 是 k8s集群的⼀个 WEB UI管理⼯具

  1. 使用国外GitHub拉取Dashboard版本,github上有k8s版本对应的版本信息

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
  1. 修改Dashboard文件名

    mv recommended.yaml kubernetes-dashboard.yaml

  2. 进入 kubernetes-dashboard.yaml 添加通信方式和对外暴露的端口

    NodePort 服务是引导外部流量到你的服务的最原始方式,在节点上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务供外部访问。

    kind: Service
    apiVersion: v1
    metadata:
    labels:
      k8s-app: kubernetes-dashboard
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
    spec:
    type: NodePort #需添加访问方式
    ports:
      - port: 443
        targetPort: 8443
        nodePort: 31002 #需添加对外暴露的端口
  3. 重新生成dashboard

    kubectl apply -f  kubernetes-dashboard.yaml
  4. 查看pod,svc状态:

    kubectl get pod,svc -n kubernetes-dashboard
  5. 因为证书问题,解决k8s自签名SSL验证不通过的问题,以chrome为例

    chrome://flags/#allow-insecure-localhost

    And enable "Allow invalid certificates for resources loaded from localhost.

  6. 获取token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-admin|awk '{print $1}')|grep token:|awk '{print $2}'
  7. 创建service account并绑定默认cluster-admin管理员集群角色

    kubectl create serviceaccount dashboard-admin -n kube-system
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
  8. 输入生成tokan访问dashboard

posted on 2021-08-17 14:43  白糖℃  阅读(603)  评论(0编辑  收藏  举报