整体流程

  1. 每个节点上安装 docker
  2. 每个节点上安装 kubeadm kubectl kubelet
  3. 在控制节点上使用 kubeadm 初始化创建 Cluster
  4. 配置 kubectl (kube-apiserver 连接信息及 credentials)
  5. 安装 pod 网络插件 (CNI)

    安装 docker

    关于当前k8s 版本与 docker 版本匹配问题可查询文档:
    https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#docker

    centos 7.9.2009

    1. ### 安装所需包
    2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    3. ### 新增官方 Docker 仓库
    4. # sudo yum-config-manager --add-repo \
    5. # https://download.docker.com/linux/centos/docker-ce.repo
    6. # 阿里镜像站
    7. cat > /etc/yum.repos.d/docker-ce-aliyun.repo << 'EOF'
    8. [docker-ce-stable]
    9. name=Docker CE Stable - $basearch
    10. baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
    11. enabled=1
    12. gpgcheck=1
    13. gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
    14. EOF
    15. # k8s-1.19 最后一个支持 docker-shim 的版本
    16. sudo yum update -y && sudo yum install -y \
    17. containerd.io-1.2.13 \
    18. docker-ce-19.03.11 \
    19. docker-ce-cli-19.03.11
    20. ## 创建 /etc/docker 目录
    21. sudo mkdir /etc/docker
    22. # 设置 Docker daemon
    23. cat <<EOF | sudo tee /etc/docker/daemon.json
    24. {
    25. "exec-opts": ["native.cgroupdriver=systemd"],
    26. "log-driver": "json-file",
    27. "log-opts": {
    28. "max-size": "100m"
    29. },
    30. "storage-driver": "overlay2",
    31. "storage-opts": [
    32. "overlay2.override_kernel_check=true"
    33. ]
    34. }
    35. EOF
    36. # Create /etc/systemd/system/docker.service.d
    37. sudo mkdir -p /etc/systemd/system/docker.service.d
    38. sudo systemctl daemon-reload
    39. sudo systemctl restart docker
    40. sudo systemctl enable docker

    安装 kubeadm kubectl kubelet

    Ubuntu Debian

    官方脚本
    sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
    deb https://apt.kubernetes.io/ kubernetes-xenial main
    EOF
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    
    使用阿里云镜像站
    sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes-aliyun.list
    deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
    EOF
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    

    centos 7.9.2009

    # google 官方仓库
    # cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    # [kubernetes]
    # name=Kubernetes
    # baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-# el7-x86_64
    # enabled=1
    # gpgcheck=1
    # repo_gpgcheck=1
    # gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg # https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    # EOF
    # 使用阿里云镜像站
    cat <<EOF > /etc/yum.repos.d/kubernetes-aliyun.repo
    [kubernetes-aliyun]
    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
    # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    systemctl enable --now kubelet
    
    一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
    
    为使用 IPVS 模式做准备
    yum -y install ipvsadm
    modprobe br_netfiltere4r
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe ip_vs
    modprobe ip_vs_rr
    modprobe ip_vs_lc
    modprobe ip_vs_dh
    modprobe ip_vs_sh
    modprobe ip_vs_sed
    modprobe ip_vs_nq
    modprobe ip_vs_wrr
    modprobe nf_conntrack
    EOF
    chmod 755 /etc/sysconfig/modules/ipvs.modules \
    && bash /etc/sysconfig/modules/ipvs.modules && lsmod \
    | grep -e ip_vs -e nf_conntrack_ipv4
    

    配置 Docker cgroup driver

    The recommended driver is “systemd”, Sometime the driver is “cgroup”
    https://kubernetes.io/docs/setup/production-environment/container-runtimes/

    使用 kubeadm

    指定内网地址:
    --apiserver-advertise-address=
    指定镜像仓库:
    --image-repository=registry.aliyuncs.com/google_containers
    指定kubernetes版本:
    --kubernetes-version=v1.11.6
    --kubernetes-version=v1.12.4
    --kubernetes-version=v1.13.4

    准备使用 Flannel

    kubeadm init --pod-network-cidr=10.244.0.0/16
    

    准备使用 Calico

    kubeadm init --pod-network-cidr=192.168.0.0/16
    

    问题

    # 如果报错:
    # [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
    modprobe br_netfilter
    # [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
    echo 1 > /proc/sys/net/ipv4/ip_forward
    

    配置kubectl

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

    安装网络插件

    使用 Flannel

    经典方案,自动化适配部署稳定,网络性能普通
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
    

    使用 Calico

    高性能方案,部署需要结合网络环境修改配置,支持K8S网络策略对象
    官方参考: https://docs.projectcalico.org/v3.4/getting-started/kubernetes/
    ipip和cross-subnet: https://blog.csdn.net/mailjoin/article/details/79695463
    # 安装calico专用etcd
    kubectl apply -f \
    https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/etcd.yaml
    # 安装calico
    kubectl apply -f \
    https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml
    # 下载 manifast ,准备修改,禁用 IPIP
    curl https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml -O
    wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
    wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
    
    使用定制过的
    kubectl apply -f \
    https://raw.githubusercontent.com/xiangxiaoc/k8s-manifest/master/calico/etcd.yaml
    kubectl apply -f \
    https://raw.githubusercontent.com/xiangxiaoc/k8s-manifest/master/calico/calico.yaml
    

    使用 Canal

kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml

取消 master 节点污点

开发环境取消 Master 污点,让普通 pod 可以被调度到这台 master 节点上
kubectl taint nodes --all node-role.kubernetes.io/master-

重置集群

删除所有管理节点的 pod

kubeadm reset

获取kubeadm init 时候的配置

kubectl -n kube-system get cm kubeadm-config -o yaml
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n