最近在学习 kubernetest
可是 Google 上有很是多的教程关于如何部署 kubernetes
。node
本来是想在本身买的 JD
和 HUAWEI
的 ECS
上面部署的,可是折腾了好久无果。无奈仍是选用同一个云服务商提供的 ECS,在有 VPC
的条件下部署会更方便。linux
因为只是学习,笔者就不部署高可用的 k8s
集群了,因此准备一台 Master
和 Node
节点。 git
因为 Master
至少须要 2 个 CPU 核心。这里选择了 Vultr
上 2 核 4G 内存
配置的 ECS
。github
Node
节点配置固然是内存越大越好,固然只是处于学习的目的,这里就选择与 Master
相同的配置。 web
国外的云服务厂商通常是没有带宽限制的,通常是按照流量计算的,这个配置有 3T
的流量是确定够的。 docker
而后他的收费模式是按小时计算的这个配置 0.03 $ / h
至关于 0.21 ¥ / h
,也就是每小时两毛钱!就算你用一天也就四块钱。 api
笔者打算在学习 k8s
的时候在部署两个实例,不用了直接销毁,岂不美哉。 安全
新用户的话还能免费到帐 100 $
,这里是邀请的链接 Vultr Give $100,要是以为还不错的话能够试试,笔者是真的以为他们的服务还不错,因此给他们打个广告。 bash
这里选择两个 CentOS 7 Without SELinux
的实例。
SELinux
是 Linux
下的一个安全相关的软件,为了方便学习和部署,咱们直接关闭它,因此选择 Without SELinux
就准备开始部署了。
注意在 Additional Features
处勾选 Enable Private Networking
,让 Vultr
为你的服务器分配内网 IP
。
设置好两个节点的 HostName
防止待会节点名称冲突。
在 Deploy Now
以前将 Servers Qty
增长为 2
,这样就不用反复打开部署页面了,直接部署两个实例。
别被这 $20.00 /mo
吓到了,这是每个月 $20
,咱们只须要用完了及时销毁就好,并且新用户赠送的 100$
能够用好久了。
部署完成两个实例后,就能够在 Instances
列表找到他们。 (考虑到没有使用过云服务的读者,这里笔者讲详细一点。)
在点进这个实例能够在 Overview
找到他的登陆帐号密码,默认用户是 root
。
而后在 Settings
能够看到这两个实例的内网 IP
。
这里笔者的两个实例的内网以下:
实例 | 核心数 | 内存 | 内网 IP |
---|---|---|---|
Master | 2 | 4G | 10.24.96.3 |
Node | 2 | 4G | 10.24.96.4 |
接下来就正式开始了,不过 ssh
进入系统后还须要作一些准备工做。
首先避免没必要要的麻烦,先关闭 CentOS 7
的防火墙,由于自己云服务厂商会有安全组,咱们也能够经过配置安全组来实现网络安全防御。
systemctl disable firewalld && systemctl stop firewalld复制代码
如果前面在部署实例的时候没有选择 Without SELinux
这里则须要让容器能够访问主机文件,须要输入如下命令。
# 将 SELinux 设置为 permissive 模式(至关于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config复制代码
咱们还须要关闭 swap,至于为何感兴趣能够去搜一下。
swapoff -a复制代码
确保在 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复制代码
确保已加载了 br_netfilter
模块。这能够经过运行 lsmod | grep br_netfilter
来完成。要显示加载它,请调用 modprobe br_netfilter
。
modprobe br_netfilter
lsmod | grep br_netfilter复制代码
安装 docker
:
yum install -y docker
systemctl enable docker && systemctl start docker复制代码
笔者已经将上述步骤作成了脚本,能够查看 gist.github.com/elfgzp/0248…。 为了快速进入下一步能够执行如下命令直接跳过准备操做。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_prepare.sh | sh复制代码
接下来的步骤能够彻底参考官方文档来了,官方文档连接。
# 配置 yum 源
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
# 安装 kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启动 kubelet
systemctl enable --now kubelet复制代码
因为 Vultr
是国外的云主机,因此咱们根本不用考虑 Google
的访问问题,可是若是是国内的主机须要将 yum
源的 repo
修改成如下配置。
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kuebrnetes]
name=KubernetesRepository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF复制代码
上述操做的脚本,gist.github.com/elfgzp/0248…。
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/#/vultr_k8s_prepare.sh | sh复制代码
咱们首先要在 Master
的实例上执行 kubeadm
。可是咱们先使用 kubeadm config print init-defaults
来看看它的默认初始化文件。
kubeadm config print init-defaults复制代码
固然你也能够生成一个配置文件后,指定配置文件进行初始化:
kubeadm config print init-defaults > kubeadm.yaml
# 修改 kubeadm.yml
kubeadm init --config kubeadm.yaml复制代码
若是初始化失败能够执行如下命令,进行重制:
kubeadm reset
rm -rf $HOME/.kube/config
rm -rf /var/lib/cni/
rm -rf /etc/kubernetes/
rm -rf /etc/cni/
ifconfig cni0 down
ip link delete cni0复制代码
接下来直接执行 kubeadm init
进行初始化,国内的主机可能须要修改 imageRepository
的配置,来修改 k8s
的镜像仓库。
cat <<EOF > kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
apiServer:
extraArgs:
runtime-config: "api/all=true"
kubernetesVersion: "v1.18.1"
imageRepository: registry.aliyuncs.com/google_containers
EOF
kubeadm init --config kubeadm.yaml复制代码
执行完成后,咱们会获得如下输出:
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 {你的IP}:6443 --token 3prn7r.iavgjxcmrlh3ust3 \
--discovery-token-ca-cert-hash sha256:95283a2e81464ba5290bf4aeffc4376b6d708f506fcee278cd2a647f704ed55d复制代码
按照他的提示,咱们将 kubectl
的配置放到 $HOME/.kube/config
下,注意每次执行完成 kubeadm init
以后,配置文件都会变化,因此须要从新复制。kubeadm
还会输出 join 命令的配置信息,用于 Node
加入集群。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config复制代码
若是大家是使用 root
用户的话,能够直接利用环境变量指定配置文件:
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
. ~/.bashrc复制代码
接下来使用 kubectl get nodes
来查看节点的状态:
NAME STATUS ROLES AGE VERSION
master1 NotReady master 6m52s v1.18.1复制代码
此时的状态为 NotReady
固然这个状态是对的,由于咱们尚未安装网络插件。接下来安装网络插件,这里是用的是 Weave
网络插件:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"复制代码
还有其余的网络插件能够参考官方文档,Installing a Pod network add-on。
能够经过查看 Pods
状态查看是否安装成功:
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-br94l 1/1 Running 0 14m
kube-system coredns-66bff467f8-pvsfn 1/1 Running 0 14m
kube-system kube-proxy-b2phr 1/1 Running 0 14m
kube-system weave-net-8wv4k 2/2 Running 0 2m2s复制代码
若是发现 STATUS
不是 Running
能够经过,kubectl logs
和 kubectl describe
命令查看详细的错误信息。
kubectl logs weave-net-8wv4k -n kube-system weave
kubectl logs weave-net-8wv4k -n kube-system weave-npc
kubectl describe pods weave-net-8wv4k -n kube-system 复制代码
此时的 Master
节点状态就变为 Ready
了。
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1复制代码
Node
节点部署 Node
节点一样须要「准备阶段」的工做,这里就不一一讲解了,直接执行脚本:
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_prepare.sh | sh
curl https://gist.githubusercontent.com/elfgzp/02485648297823060a7d8ddbafebf140/raw/781c2cd7e6dba8f099e2b6b1aba9bb91d9f60fe2/vultr_k8s_install_kubeadm.sh | sh复制代码
咱们须要执行 kubeadm
在 Master
节点初始化后输出的 join
命令。若是不记得了,能够经过在 Master
执行如下命令从新得到 join
命令。
kubeadm token create --print-join-command
kubeadm join {你的IP}:6443 --token m239ha.ot52q6goyq0pcadx --discovery-token-ca-cert-hash sha256:95283a2e81464ba5290bf4aeffc4376b6d708f506fcee278cd2a647f704ed55d复制代码
若加入时出现问题一样可使用 kubeadm rest
来重置。
kubeadm reset复制代码
固然 join
命令也是能够提供配置文件的,咱们只须要在 Node
上执行如下命令就能够生成默认配置文件了。
kubeadm config print join-defaults > kubeadm-join.yaml
kubeadm join --config kubeadm-join.yaml复制代码
而后再次经过 kubectl
查看 nodes
状态,若是但愿在 Node
节点上执行的话,须要将 Master
上的 /etc/kubernetes/admin.conf
复制到 Node
节点上。
接下来咱们验证 Node
的状态为 Ready
则加入成功:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 6m52s v1.18.1
node1 Ready <none> 29s v1.18.1复制代码
以上就是在 Vultr
上使用 kubeadm
部署 k8s
集群的全部过程啦,固然也是踩了不少坑。特别是想在不一样的云主机上部署,最终仍是选择使用同一个云服务商的 ECS。
Kubernetes权威指南:从Docker到Kubernetes实践全接触(第4版)
本文由博客一文多发平台 OpenWrite 发布!