Kubernetes在2014年开源后,很快便占据了容器编排的主导地位,成为容器编排的事实标准。那么Kubernetes的安装是了解它的第一步。目前有非常多的工具方法来实现Kubernetes的安装,收集了一些如下。

  • kubeadm:https://github.com/kubernetes/kubeadm
    kubeadm是官方提供的最为通用的一种部署方案。
  • kops:https://github.com/kubernetes/kops
    kops通过命令行创建,销毁,升级和维护生产级,高可用性的Kubernetes集群。目前正式支持AWS(Amazon Web Services),其中GCE和OpenStack处于beta测试阶段,而VMware vSphere处于alpha阶段。
  • kubespray:https://github.com/kubernetes-sigs/kubespray
    kubespray通过 Ansible Playbook 来定义系统与 Kubernetes 集群部署的任务。
  • KubeOperator: https://github.com/KubeOperator/KubeOperator
    KubeOperator 是一个Fit2Cloud开源项目,在离线网络环境下,通过可视化 Web UI 在 VMware、Openstack 或者物理机上规划、部署和运营生产级别的 Kubernetes 集群。
  • ansible-install-k8s:https://github.com/lizhenliang/ansible-install-k8s
    ansible-install-k8s支持离线安装,是属于个人开发的ansible部署脚本
  • kind:https://github.com/kubernetes-sigs/kind
    Kind(Kubernetes in Docker) 是一个 Kubernetes 孵化项目,Kind 是一套开箱即用的 Kubernetes 环境搭建方案。顾名思义,就是将 Kubernetes 所需要的所有组件,全部部署在一个 Docker 容器中,可以很方便的搭建 Kubernetes 集群。
  • sealos:https://github.com/fanux/sealos
    Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,Sealos 能很好的支持在生产环境中部署高可用的 Kubernetes 集群。

使用kubeadm部署单机版k8s

Master节点安装

  1. 机器准备
  • 虚机配置2核4G以上
  • 可访问外网
  • 操作系统CentOS 7.6
  1. 准备工作

    1
    2
    3
    4
    5
    6
    7
    8
    $ systemctl stop firewalld
    $ systemctl disable firewalld
    $ setenforce 0
    $cat /etc/selinux/config
    ...
    SELINUX=disabled
    ...
    $ hostnamectl set-hostname master1
  2. 添加k8s yum源

    1
    2
    3
    4
    [k8s]
    name=k8s
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgcheck=0
  3. 确保 iptables 工具不使用 nftables 后端

    1
    $ update-alternatives --set iptables /usr/sbin/iptables-legacy
  4. 安装软件

    1
    2
    $ yum install -y docker kubelet kubeadm kubectl kubernetes-cni
    $ echo "KUBELET_EXTRA_ARGS=--cgroup-driver=systemd" > /etc/sysconfig/kubelet
  5. 关闭系统的Swap

    1
    2
    3
    4
    5
    6
    $ swapoff -a
    $ # 将/etc/fstab文件中的Swap注释掉
    $ cat /etc/fstab
    /dev/mapper/VolGroup00-LogVol00 / xfs defaults 0 0
    UUID=1539acb0-0589-4eae-a0a4-24566186e425 /boot xfs defaults 0 0
    #/dev/mapper/VolGroup00-LogVol01 swap swap defaults 0 0
  6. 创建/etc/sysctl.d/k8s.conf文件,添加如下内容

    1
    2
    3
    4
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness=0
  7. 启动docker与配置kubelet服务

    1
    2
    3
    systemctl start docker
    systemctl enable docker
    systemctl enable kubelet
  8. 对docker进行加速,在/etc/sysconfig/docker配置项中添加如下内容

    1
    --registry-mirror=https://r03u9tep.mirror.aliyuncs.com
  9. 使用hub.docker.com中的镜像,例如:docker.io/aiotceo/kube-apiserver

    1
    2
    3
    4
    5
    6
    $ # 下载aiotceo镜像
    $ kubeadm config images list | sed -e 's/^/docker pull /g' -e 's/k8s.gcr.io/docker.io\/aiotceo/g' -e 's/-0//g' | sh -x
    $ #将aiotceo重新tag到k8s.gcr.io
    $ docker images | grep aiotceo | awk '{print "docker tag " $1":"$2,$1":"$2}' | sed -e "s#docker.io/aiotceo#k8s.gcr.io#2" -e "s#3.4.3#3.4.3-0#2" | sh -x
    $ #删除aiotceo镜像
    $ docker images |grep aiotceo |awk '{print "docker rmi ", $1":"$2}' |sh -x
  10. 初始化kube集群

    1
    2
    3
    4
    $ kubeadm init
    ...
    kubeadm join 10.0.2.15:6443 --token 8o8yv2.tv836s1jncmrwgsp \
    --discovery-token-ca-cert-hash sha256:d9d15b5905e8defc0ef6de294be5eff08d720ed9d98b8d6cb99d153bc7332e8e
  11. 创建管理员访问文件

    1
    2
    $ mkdir -p $HOME/.kube
    $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  12. 安装网络插件,例如calico

    1
    $ kubectl apply -f https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
  13. 查看k8s状态

    1
    2
    3
    $ kubectl get node
    NAME STATUS ROLES AGE VERSION
    node1 Ready master 14m v1.18.2

添加计算节点

重复 0-9 步,完成环境准备,安装软件及下载镜像。
10. kubeadm将计算节点加入集群

1
2
kubeadm join 10.0.2.15:6443 --token 8o8yv2.tv836s1jncmrwgsp \
--discovery-token-ca-cert-hash sha256:d9d15b5905e8defc0ef6de294be5eff08d720ed9d98b8d6cb99d153bc7332e8e
  1. 查看k8s状态
    1
    2
    3
    4
    $ kubectl get node
    NAME STATUS ROLES AGE VERSION
    node1 Ready master 14m v1.18.2
    node2 Ready <none> 30m v1.18.2

补充说明:

  1. 安装时可以通过kubeadm config print init-defaults查看默认配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    $ kubeadm config print init-defaults
    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
    - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
    kind: InitConfiguration
    localAPIEndpoint:
    advertiseAddress: 1.2.3.4
    bindPort: 6443
    nodeRegistration:
    criSocket: /var/run/dockershim.sock
    name: master1
    taints:
    - effect: NoSchedule
    key: node-role.kubernetes.io/master
    ---
    apiServer:
    timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controllerManager: {}
    dns:
    type: CoreDNS
    etcd:
    local:
    dataDir: /var/lib/etcd
    imageRepository: k8s.gcr.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.18.0
    networking:
    dnsDomain: cluster.local
    serviceSubnet: 10.96.0.0/12
    scheduler: {}
  2. 使用kubeadm init --config可以指定kubeadm配置文件

参考文章

使用kubeadm安装kubernetes_v1.18.x
利用 kubeadm 创建高可用集群