利用 Kubeadm 搭建 Kubenetes 集群
学习 Kubenetes 的第一步肯定是要搭建一个可用集群来进行实践了。K8S 集群有三种搭建方式:Minikube:搭建单节点 K8S 集群Kubeadm:社区提供的工具,用于快速搭建 K8S 集群二进制方式二进制方式过于复杂,对新手很不友好,而 Minikube 只能搭建单节点集群,因此我们选择 Kubeadm 搭建我们的多节点集群。一. 安装 DockerDocker 的安装...
学习 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 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。
更多推荐
所有评论(0)