在Ubuntu 18.04上部署Kubernetes

时间:2020-01-09 10:34:18  来源:igfitidea点击:

Kubernetes已成为在云中进行容器编排和调度的事实上的平台。现在可以从所有主要的云平台(例如AWS,Azure和GCP)使用它。甚至像Digital Ocean这样的小型云提供商也提供产品。

Kubernetes是为云设计的,其架构依赖于它。但是,对于那些希望在前提下运行完整Kubernetes集群的人来说,这样做的能力是有限的。直到最近,我们才需要使用带有NSX的vSphere来享受全部功能。通过创建MetalLB,我们现在可以在裸机上或者在任何基础架构上将VM作为虚拟机运行。

在本教程中,将向我们展示如何在Ubuntu 18.04之上构建自己的集群。

准备工作

以下内容应视为在内部搭建Kubernetes集群的最低要求。实际节点大小将在很大程度上取决于我们希望迁移到Kubernetes的工作负载类型。

  • 管理员:具有2个CPU和2 GB RAM的Ubuntu 18.04服务器
  • 节点:具有2个CPU和1 GB RAM的Ubuntu 18.04服务器

安装Docker

Kubernetes是Docker的协调器,这意味着任何运行Kubernetes的系统都将需要Docker。以下说明基于Docker为Ubuntu 18.04提供的文档。

  • 为Docker安装依赖项
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
  • 为官方的Ubuntu Docker存储库安装GPG密钥。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 添加正式的Docker存储库。
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  • 安装Docker Community Edition。
sudo apt install docker-ce

配置Docker代理设置

如果Kubernetes节点在代理后面,则需要配置代理设置。 Docker将不会使用通过环境变量设置的代理设置。相反,我们将必须为Docker配置SystemD服务以设置代理。

  • 创建目录以存储Docker SystemD配置文件。
mkdir /etc/systemd/system/docker.service.d
  • 创建一个名为http-proxy.conf的配置文件,并将以下内容添加到该文件中。
[Service]
Environment="HTTP_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="HTTPS_PROXY=https://web-proxy.corp.xxxxxx.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com
  • 运行systemctl守护程序重新加载。
sudo systemctl daemon-reload
  • 重新启动Docker。
sudo systemctl restart docker

安装Kubernetes

Kubernetes具有Ubuntu的官方存储库。我们将通过apt安装Kubernetes的软件包,以简化我们的服务器配置。

  • 添加Kubernetes GPG密钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
  • 添加官方存储库。
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
  • 安装Kubernetes
sudo apt install kubeadm
  • 禁用交换。
sudo swap off -a
  • 打开/ etc / fstab并注释掉交换分区。

创建新的Kubernetes集群(管理器节点)

我们选择作为主节点的服务器之一,必须启动新的Kubernetes集群。运行以下命令以创建一个将子网10.224.0.0/16用于其内部网络的新群集。

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

成功启动Kubernetes集群后,kubeadm将输出连接集群所需的信息,以及有关如何向集群添加节点的信息。保留此信息的记录,因为没有它,我们将无法将新节点加入集群。

Your Kubernetes master has initialized successfully!
 
To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
You can now join any number of machines by running the following on each node
as root:
 
  kubeadm join 192.168.54.18:6443 --token 01i2nx.veva1984qksr731c --discovery-token-ca-cert-hash sha256:8773dc61ef0fc5bddc9bd231406c19241fac298f3c423d01741b12d17d5da23a

添加CNI网络层

Kubernetes是非常模块化的,可以灵活配置每个核心组件。对于联网,我们可以使用许多选项。我们决定使用哪一个可能取决于我们计划在其中运行Kubernetes的环境。在本教程中,我们将使用Flannel。另一个流行的选择是编织网。

  • 为Kubernetes安装Flannel CNI插件。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

第2层网络

Kubernetes是一个专为在云环境中运行而设计的平台。由于这样的Kubernetes在很大程度上依赖于云平台提供的网络API,因此将其部署到外部公开服务和Pod。对于任何想在公共或者私有云平台之外运行Kubernetes的人来说,这当然是有问题的。

MetalLB通过提供一种向Kubernetes本地添加网络第2层功能的方法来解决这一差距。使用它,我们可以分配IP地址范围,以分配用于外部网络的服务和Pod。

  • 为MetalLB配置Kubernetes。
  • 安装MetalLB插件。
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/example-layer2-config.yaml
  • 通过创建yam文件配置MetalLB。我们将文件命名为metallb-config.yaml,它将具有以下内容。
---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.57.224/27

将节点加入集群

使用我们在启动集群时kuebadm输出的信息,现在可以将节点加入集群了。

  • 将节点加入集群。
kubeadm join 192.168.54.18:6443 --token 01i2nx.veva1984qksr731c --discovery-token-ca-cert-hash sha256:8773dc61ef0fc5bddc9bd231406c19241fac298f3c423d01741b12d17d5da23a
  • 验证新节点的状态。
kuebadm get nodes