Kubeadm 搭建 kubernetes 集群 - lizunyi/kubeadm-kubernetes GitHub Wiki

一·准备环境

  • 软件版本:

    • kubernetes v1.13.2
    • CentOS Linux release 7.6.1810 (Core)
    • Docker 18.09.1
    • flannel v0.10.0-amd64
  • 节点规划:

    • 191.168.1.50 master
    • 191.168.1.51 node1
    • 191.168.1.52 node2
  • 系统配置(在所有节点上执行)

    • 配置/etc/hosts
      [root@data1 ~]# cat <<EOF >> /etc/hosts
      191.168.1.50 master
      191.168.1.51 node1
      191.168.1.52 node2
      EOF

    • 关闭防火墙
      [root@data1 ~]# systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

    • 关闭SELinux
      [root@data1 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
      [root@data1 ~]# setenforce 0

    • 关闭swap
      [root@data1 ~]# swapoff -a
      [root@data1 ~]# sed -i 's/.*swap.*/#&/' /etc/fstab

    • 配置转发参数
      [root@data1 ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF

    • 设置国内kubernetes阿里云源
      [root@data1 ~]# 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=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

    • 安装docker

      • 设置官方docker源
        [root@data1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
      • 首先查看如果有低版本的先删除,再下载18.09.1(尽可能使用更高的版本)
        查看 [root@data1 ~]# yum list installed | grep docker
        删除 [root@data1 ~]# yum remove xxxx
        安装 [root@data1 ~]# yum install -y docker-ce.x86_64
      • 配置国内镜像仓库加速器
        [root@data1 ~]# sudo mkdir -p /etc/docker
        编辑 [root@data1 ~]# vim /etc/docker/daemon.json
        追加
        "registry-mirrors": [ "https://registry.docker-cn.com","https://hdi5v8p1.mirror.aliyuncs.com"], "live-restore":true
      • 启动docker
        [root@data1 ~]# systemctl daemon-reload
        [root@data1 ~]# systemctl enable docker && systemctl start docker && systemctl status docker
    • 加载IPVS内核

      • 加载ipvs内核,使node节点kube-proxy支持ipvs代理规则
        [root@data1 ~]# modprobe ip_vs_rr
        [root@data1 ~]# modprobe ip_vs_wrr
        [root@data1 ~]# modprobe ip_vs_sh
      • 并添加到开机启动文件/etc/rc.local里面
        [root@data1 ~]# cat <<EOF >> /etc/rc.local
        modprobe ip_vs_rr
        modprobe ip_vs_wrr
        modprobe ip_vs_sh
        EOF
    • 安装kubernetes相关组件
      [root@data1 ~]# yum install kubelet kubeadm kubectl -y
      [root@data1 ~]# systemctl enable kubelet

二.安装master节点

  • 下载docker 镜像(注意k8s组件的镜像要与 kubeadm 版本一致)
    (因为国内没办法访问Google的镜像源,变通的方法是从其他镜像源下载后)

    [root@data1 ~]# kube_version=:v1.13.2
    [root@data1 ~]# kube_images=(kube-proxy kube-scheduler kube-controller-manager kube-apiserver)
    [root@data1 ~]# addon_images=(etcd:3.2.24 coredns:1.2.6 pause:3.1)

    [root@data1 ~]# for imageName in ${kube_images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName$kube_version
    done

    [root@data1 ~]# for imageName in ${addon_images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    done

    下载完镜像之后可以验证一下
    [root@data1 ~]# docker images

  • 使用kubeadm init自动安装 Master 节点
    注意:

    • 1.需要指定版本 --kubernetes-version=xxx
    • 2.需要指定镜像库 --image-repository=xxx ,默认是 k8s.gcr.io
      [root@data1 ~]# kubeadm init --kubernetes-version=v1.13.2 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
      成功之后会有如下输出
      ...
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      ...
      You can now join any number of machines by running the following on each node
      as root:

    kubeadm join 192.168.1.50:6443 --token 3mfpdm.atgk908eq1imgwqp --discovery-token-ca-cert-hash ha256:ff67ead9f43931f08e67873ba00695cd4b997f87dace5255ff45fc386b08941d
    ...

  • 按照kubeadm init 的输出执行如下命令.
    [root@data1 ~]# mkdir -p $HOME/.kube
    [root@data1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@data1 ~]# sudo chmod 777 -R $HOME/.kube

  • 给pod配置网络
    pod网络插件是必要安装,以便pod可以相互通信。在部署应用和启动kube-dns之前,需要部署网络,kubeadm仅支持CNI的网络。
    pod支持的网络插件有很多,如Calico,Canal,Flannel,Romana,Weave Net等,因为之前我们初始化使用了参数--pod-network- cidr=10.244.0.0/16,所以我们使用插件flannel。
    执行如下命令:
    [root@data1 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
    检查是否正常启动,因为要下载flannel镜像,需要时间会稍微长一些。
    [root@data1 ~]# kubectl get pods --all-namespaces

三.安装node节点(依次在node节点上执行)

  • 下载docker 镜像(注意k8s组件的镜像要与 kubeadm 版本一致)
    (因为国内没办法访问Google的镜像源,变通的方法是从其他镜像源下载后)

    [root@data1 ~]# kube_version=:v1.13.2
    [root@data1 ~]# coredns_version=:1.2.6
    [root@data1 ~]# pause_version=:3.1

    [root@data1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy$kube_version
    [root@data1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause$pause_version
    [root@data1 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns$coredns_version
    下载完镜像之后可以验证一下
    [root@data1 ~]# docker images

  • 添加节点

    • 我们在master节点上初始化成功的时候,在最后有一个kubeadm join的命令,就是用来添加node节点的。
      [root@data1 ~]# kubeadm join 192.168.1.50:6443 --token 3mfpdm.atgk908eq1imgwqp --discovery-token-ca-cert-hash sha256:ff67ead9f43931f08e67873ba00695cd4b997f87dace5255ff45fc386b08941d
      成功之后会有如下输出
      ...
      Run 'kubectl get nodes' on the master to see this node join the cluster.
      ...
      可以执行 kubectl get nodes 在node节点上查看k8s 集群节点状态.如果发现报错,如 x509: certificate has expired or is not yet valid,说明kubectl的config配置不正确,可从master节点上复制过来
      scp $HOME/.kube/config node1:/$HOME/.kube/config

四.kube-proxy 启动 ipvs

从kubernetes1.8版本开始,新增了kube-proxy对ipvs的支持,并且在新版的kubernetes1.11版本中被纳入了GA。
iptables模式问题不好定位,规则多了性能会显著下降,甚至会出现规则丢失的情况;相比而言,ipvs就稳定的多。
默认安装使用的是iptables,我们需要进行修改配置开启ipvs。

  • 加载内核模块(上面准备环境时已经设置过了)
    [root@data1 ~]# modprobe ip_vs_rr
    [root@data1 ~]# modprobe ip_vs_wrr
    [root@data1 ~]# modprobe ip_vs_sh

  • 更改kube-proxy配置
    [root@data1 ~]# kubectl edit configmap kube-proxy -n kube-system
    找到如下部分:
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"
    nodePortAddresses: null
    oomScoreAdj: -999

    其中mode原来是空,默认为iptables模式,改为ipvs。scheduler默认是空,默认负载均衡算法为轮训

  • 删除所有kube-proxy的pod
    [root@data1 ~]# kubectl delete pod -n kube-system kube-proxy-xxxxx

  • 查看kube-proxy的pod日志,验证是否成功
    [root@data1 ~]# kubectl logs -n kube-system kube-proxy-xxxxx

    • 查看日志第一行是否输出Using ipvs Proxier
  • 安装ipvsadm
    使用ipvsadm查看ipvs相关规则,如果没有这个命令可以直接yum安装
    [root@data1 ~]# yum install -y ipvsadm

    • 使用 ipvsadm -ln 验证
      [root@data1 ~]# ipvsadm -ln

################k8s 集群部署完毕################
#############################################
################写给自己####################

  • 要多了解yaml配置文件

  • 要多了解Doployment,RS,Service,ServiceAccount,Role,ClusterRole,ClusterRoleBing,ConfigMap,Ingress,DaemonSet等kind的配置

  • 要多了解kube-proxy的使用

  • 要多了解nfs,pv,pvc挂载的使用

  • 要多了解ServiceAccount,ClusterRole,ClusterRoleBinding的使用

  • 要多了解k8s GC 的原理以及配置

    • k8s GC: 当磁盘到达一定80%的时候,会导致清除容器,以及镜像等
  • 要避免使用nodePort

  • 搭建 kubernetes-dashboard 从工作台查看集群状态

  • 搭建node-exporter+prometheus+grafana exporter收集集群数据,prometheus保存数据,grafana提供图表展示

  • 要学会书写 Prometheus Job 的配置

  • 要学会Java调用kube-apisever 使用 token 或者 证书的调用.
    配置kube-apiserver http方式

    • 找到 /etc/kubernetes/manifests/kube-apiserver.yaml,添加以下参数
      • --insecure-port=8000
      • --insecure-bind-address=122.114.95.115
      • --anonymous-auth=false
    • 修改 livenessProbe健康检查的port 为 8000,scheme为 http livenessProbe:
      failureThreshold: 8
      httpGet:
      host: xxx.xxx.xxx.xx
      path: /healthz
      port: 8000
      scheme: HTTP
⚠️ **GitHub.com Fallback** ⚠️