文章目录
前言
k8s作为一个容器编排工具,因为其简化容器管理,提升工作效率而备受青睐。但是由于某些不可描述的原因,在中国部署k8s要更加困难,所以这里介绍一种不用科学上网部署k8s-1.14.2版本的方法。
部署环境
IP地址 | 节点角色 | CPU数 | 内存 | 主机名 |
---|---|---|---|---|
192.168.88.200 | master | 2 | 2G | master |
192.168.88.201 | node | 2 | 2G | node1 |
192.168.88.201 | node | 2 | 2G | node2 |
master节点的内存占用很严重,有条件尽量多给一点,最少2G,亲测卡的要死。
并且完成域名解析
准备工作
以下操作须在所有主机中进行
关闭selinux和firewalld
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
关闭swap
swapoff -a
vim /etc/fstab #将包含swap的行注释
配置内核参数,将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
配置yum源
docker和kubernetes的yum源都可以用阿里源
软件安装
以下操作须在所有主机中进行
安装docker
如果有其他版本的docker建议先删除
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker
systemctl restart docker
检查docker版本
docker --version
出现的应该是这个
Docker version 18.06.1-ce, build e68fc7a
安装kubernetes
yum install -y kubelet-1.14.2 kubectl-1.14.2 kubeadm-1.14.2
systemctl enable kubelet
一定要先设置kubelet开机自启,如果不设置等会会报错;但是不要启动,现在启动不了
部署master节点
初始化k8s集群
kubeadm init --kubernetes-version=1.14.2 \
--apiserver-advertise-address=192.168.88.200 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
这一步至关重要,无数初学者卡在这里并且尝试了各种报错:
第一行的参数是因为在执行 kubeadm init 时,会先请求https://dl.k8s.io/release/stable-1.txt获取最新稳定的版本号,该地址实际会跳转到https://storage.googleapis.com/kubernetes-release/release/stable-1.txt,在国内由于被墙无法请求该地址,到时候就会报错,为了避免这个问题,我们必须直接指定要获取的版本。
第二行就是我们master节点的IP地址。
第三行很关键,由于kubeadm默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址,很多人初次部署都卡在此环节无法进行后续配置。
集群初始化成功后返回如下信息:
要保留生成的最后部分内容,此内容需要在其它节点加入kubernetes集群时执行。
看到第一行末尾这个successfully了吗
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 192.168.88.200:6443 --token xotym5.cjolyg20cj17n56l \
--discovery-token-ca-cert-hash sha256:0b2bc20381b7e410beb4a98296a10ec29e6184301f1c3058f5cae81a385ed3c4
配置kubectl工具
mkdir -p /root/.kube
cp /etc/kubernetes/admin.conf /root/.kube/config
kubectl get nodes
kubectl get cs
这时候节点notready,不用担心,因为我们还没配置网络
部署flannel网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
执行完后应该会看见
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
部署node节点
在所有node节点上进行
kubeadm join 192.168.88.200:6443 --token xotym5.cjolyg20cj17n56l \
--discovery-token-ca-cert-hash sha256:0b2bc20381b7e410beb4a98296a10ec29e6184301f1c3058f5cae81a385ed3c4
就是刚才强调的那段的最后两行
集群状态检测
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 8m27s v1.14.2
node1 Ready <none> 6m32s v1.14.2
node2 Ready <none> 6m28s v1.14.2
刚开始可能会有节点notready,一般是正常情况,等一两分钟再看看
创建pod试验一下
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
部署dashboard
kubernetes-dashboard是k8s的web页面管理工具,通过dashboard可以在浏览器上打开k8s集群的管理界面,这样我们既可以通过命令行也可以通过web页面来管理k8s集群。
在master节点进行
创建Dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
编辑此文件
sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' kubernetes-dashboard.yaml
sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' kubernetes-dashboard.yaml
如果不用sed命令而直接vim编辑,应该修改的有:
在Dashboard Deployment部分修改Dashboard镜像下载链接,由于默认从官方社区下载,在国内不翻墙是下载不到的,所以让它去找阿里源下载
spec:
containers:
- name: kubernetes-dashboard
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1
在Dashboard Service内容加入nodePort: 30001和type: NodePort两项内容,将Dashboard访问端口映射为节点端口,以供外部访问
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001
type: NodePort
部署Dashboard
kubectl create -f kubernetes-dashboard.yaml
##创建完成后,检查相关服务运行状态
kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system -o wide
kubectl get services -n kube-system
netstat -anp|grep 30001
浏览器访问:https://192.168.88.200:30001,最好用火狐浏览器。
查看访问Dashboard的认证令牌
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
执行完后会显示这样一堆信息
Name: dashboard-admin-token-hvmbg
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: 451dec54-f6db-11e9-a751-000c295b0b94
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4taHZtYmciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNDUxZGVjNTQtZjZkYi0xMWU5LWE3NTEtMDAwYzI5NWIwYjk0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.c0LvOThTfmd1AEFdnuXkQikSSgF1zde5wxTuYOcAU4f0x5NHHEz_uwq_zZowieNTZSmqU2KhNzjMmVMhVEWMelsQKrQ-xyXUbUduP4JHXSMG4TW11INUiLjJGWfxgyCQe5di3EGwSw5Yc7lj8ArGlWpgiebMC8bv-VWaXoCleoDxF2hxn5J3Er4HNXs34CpmD97mHLSGqeUJpyXyJDQN-QeFzKHQy1JIWQWysFiZTS0dct1bujjciSrUp-sGu-CGoUR1ntB00vL_jNVTJMVRq97e2H32pvN_B3rNMuRDB4pMED5lamPk_K_oRRjWUSCVLsYfFVqNtgXaHCNdZACyMw
把token复制到输入令牌处即可,到此kubernetes集群正式搭建完成。