学习 Kubenetes 的第一步肯定是要搭建一个可用集群来进行实践了。K8S 集群有三种搭建方式:

  • Minikube:搭建单节点 K8S 集群
  • Kubeadm:社区提供的工具,用于快速搭建 K8S 集群
  • 二进制方式

二进制方式过于复杂,对新手很不友好,而 Minikube 只能搭建单节点集群,因此我们选择 Kubeadm 搭建我们的多节点集群。

一. 安装 Docker

Docker 的安装官网讲的很清楚,并且中间不会遇到网络问题,我用的是 Ubuntu 系统,可以参阅安装文档

配置阿里云镜像加速

Docker 拉取镜像默认是访问国外的源的,非常慢并且有的镜像无法访问,阿里云提供了镜像加速服务。注册登录后访问控制台地址

如果所示:

复制镜像加速器地址进行配置即可。

二. 安装 Kubeadm

先贴一下官方安装文档地址,下面是安装的全部命令,没有网络问题的同学可以照着直接做就行,不会遇到什么问题。

#  更新库
apt-get update && apt-get install -y apt-transport-https curl

# 添加公钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

# 添加kubernetes源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF


# 更新源并安装
apt-get update
apt-get install -y kubelet kubeadm kubectl

# 设置不随系统更新而更新
apt-mark hold kubelet kubeadm kubectl

如果是国内的网络环境,会有两个问题:

1. 公钥下载

如果服务器网络不行是无法下载公钥的,有条件的话可以先自行 FQ 到官网下载,地址为 https://packages.cloud.google.com/apt/doc/apt-key.gpg,没条件的话可以从百度网盘下载,密码是 kh0j

下载完成后执行如下命令添加即可:

apt-key add apt-key.gpg
2. 设置国内的安装源

如果我们用是国内的服务器或者本机无法正常上网的网,官网的 kubenetes 源是无法访问的,因此我们需要指定国内的源:

# 添加kubernetes 中科大的源
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF

指定源后在执行上面的下载命令就可以正常下载了。

三. Kubeadm 启动集群

在集群启动之前,先执行下面两步操作

1. 关闭swap,kubeadm不支持swap
swapoff -a
2. Docker 配置

执行如下命令:

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart docker.
systemctl daemon-reload
systemctl restart docker
3. 启动集群

如果是可以正常上网的服务器,Kubeadm 安装完成后,启动集群只需要执行如下命令即可:

kubeadm init

在初始化过程中,kubeadm 会拉取镜像,而对应的源 k8s.gcr.io 在国内网络环境下是无法拉取的。一位大神在 Github 上创建了项目 /gcr.io_mirror,把对应的镜像拉取到自己的仓库,相当于做了一层代理,使用语法如下:

// k8s.gcr.io 替换为了  gcr.azk8s.cn/google-containers 
docker pull gcr.azk8s.cn/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1 
# eq
docker pull gcr.io/google-containers/federation-controller-manager-arm64:v1.3.1-beta.1 

# special
# eq 
docker pull k8s.gcr.io/federation-controller-manager-arm64:v1.3.1-beta.1

基于此我们有两种方式解决无法拉取镜像的问题:

【1】指定镜像源后启动
kubeadm init --image-repository=gcr.azk8s.cn/google-containers

通过参数 --image-repository 指定镜像源地址,这样就可以正常拉取了。关于 kubeadm 的更多参数可以通过 man 命令查看。

【2】提前手动下载镜像
  • 查看所需镜像
$ kubeadm config images list
I1004 16:28:07.836513   17156 version.go:96] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
I1004 16:28:07.836570   17156 version.go:97] falling back to the local client version: v1.14.0
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
  • 编写脚本下载镜像

将上面的镜像的源仓库前缀 k8s.gcr.io/ 去掉,然后通过代理源下载即可。

#!/bin/bash
images=(
		kube-apiserver:v1.14.1
		kube-controller-manager:v1.14.1
		kube-scheduler:v1.14.1
		kube-proxy:v1.14.1
		pause:3.1
		etcd:3.3.10
		coredns:1.3.1
       )

for imageName in ${images[@]} ; do
docker pull gcr.azk8s.cn/google-containers/$imageName
docker tag gcr.azk8s.cn/google-containers/$imageName k8s.gcr.io/$imageName
docker rmi gcr.azk8s.cn/google-containers/$imageName
done

现在在执行 kubeadm init 命令就可以执行成功了,成功的话应该可以看到打印出下面内容,几条主要命令我单独添加了注释:

Your Kubernetes control-plane 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/

Then you can join any number of worker nodes by running the following on each as root:
# 添加工作节点的命令
kubeadm join 111.111.111.111:6443 --token 6dgktp.s21p4tucxc395i5u \
    --discovery-token-ca-cert-hash sha256:068b6c03cf59217b8343179237766a9367fc9a529e7266aa54cbee60bb0c51b6

init 完成后的命令务必要记录下来。首先要执行下面三条命令:

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

另外如果安装时没有额外的 worker 节点,但是后续想添加但是又忘了 join 命令了,可以通过下面命令重新生成:

$ kubeadm token create --print-join-command

完成后就可以查看集群状态了:

$ kubectl get nodes
NAME           STATUS     ROLES    AGE   VERSION
server001  NotReady   master   50s   v1.14.0

可以看到集群节点虽然启动了,但是状态还是 NotReady,原因是没有安装网络插件,可以通过如下命令安装:

$ kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml -O
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.extensions/calico-node created
serviceaccount/calico-node created
deployment.extensions/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

网络插件完成后再次查看节点状态,可以看到集群状态已经是 ready 了。

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-9b4ff7697-t5btf   1/1     Running   0          68m
kube-system   calico-node-5lr9v                         1/1     Running   0          67m
kube-system   calico-node-847x4                         1/1     Running   0          68m
kube-system   calico-node-czn8q                         1/1     Running   0          67m
kube-system   coredns-fb8b8dccf-nnmtb                   1/1     Running   0          71m
kube-system   coredns-fb8b8dccf-vnj64                   1/1     Running   0          71m
kube-system   etcd-yingjie01                            1/1     Running   0          70m
kube-system   kube-apiserver-yingjie01                  1/1     Running   0          70m
kube-system   kube-controller-manager-yingjie01         1/1     Running   0          70m
kube-system   kube-proxy-j89pm                          1/1     Running   0          71m
kube-system   kube-proxy-spsvs                          1/1     Running   0          67m
kube-system   kube-proxy-xjxkk                          1/1     Running   0          67m
kube-system   kube-scheduler-yingjie01                  1/1     Running   0          70m
kube-system   kubernetes-dashboard-5bd4bfc87-mqbzd      1/1     Running   0          50m

# root @ server001 in ~/k8s [9:08:18]
$ kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
server001   Ready    master   71m   v1.14.0

此时在另一台机器上执行同样的安装 Docker 和 kubeadm 操作之后,就可以使用上面打印的命令添加 worker 节点了:

kubeadm join 111.111.111.111:6443 --token 6dgktp.s21p4tucxc395i5u \
    --discovery-token-ca-cert-hash sha256:068b6c03cf59217b8343179237766a9367fc9a529e7266aa54cbee60bb0c51b6

添加完成后,应该就可以查看到新的节点状态了:


# root @ server001 in ~ [16:39:39]
$ kubectl get nodes
NAME                      STATUS   ROLES    AGE    VERSION
iz8vbb3mz6nov14a0j6l35z   Ready    <none>   2d1h   v1.14.0
server001                 Ready    master   2d2h   v1.14.0

上面就是整个安装搭建的大致过程,期间遇到的主要问题就是由于网络导致的镜像下载失败,可以通过添加阿里云容器加速服务、改变源仓库地址等方式解决,这样一个可用的 K8S 多节点集群就搭建好了。


老铁,都看到这了来一波点赞、评论、关注三连可好

我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐