利用阿里云搭建了kubernetes测试集群并在上面搭建了kubeflow组件进行机器学习。由于安装的时候kubernetes要拉去相关的镜像,公有云可以通外网,安装要简单许多,如果内网环境,就需要自己下载镜像文件,要复杂许多。如果一切顺利,搭建过程约1个多小时。
租借3台阿里云ECS,每一台配置2C8G,每块硬盘80G,租借的是抢占式,费用比较便宜,由于只是做测试,不需要多高的要求,每小时费用大概一块多。租用过程略。
操作系统 | 名字 | 节点性质 |
---|---|---|
centos-7.6 | k8s001 | master |
centos-7.6 | k8s002 | work1 |
centos-7.6 | k8s003 | work2 |
安装版本:
kubernetes 1.14.6
docker 18.06.1-ce
kubeflow 0.6.2
搭建一主两从
主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。
$ hostname
$ hostnamectl set-hostname your-name
比如 hostnamectl set-hostname k8s001
$ yum update
$ yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp wget git
2.3 关闭防火墙、swaphostame,重置iptables
$ systemctl stop firewalld && systemctl disable firewalld
$ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
$ swapoff -a
$ sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
$ setenforce 0
$ service dnsmasq stop && systemctl disable dnsmasq
$ cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
$ sysctl -p /etc/sysctl.d/kubernetes.conf
yum -y install docker 18.06.1-ce
$ systemctl enable docker
如果docker默认镜像存储路径的空间不够大,需要修改docker相关配置,但是阿里云没有这个问题,所以安装很简单
$service docker restart
$systemctl status docker
查看docker状态,显示为active则启动成功
kubeadm: 部署集群用的命令
kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期 kubectl: 集群管
理工具
$cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
$ yum install -y kubelet-1.14.6 kubeadm-1.14.6 kubectl-1.14.6
$ systemctl enable kubelet
安装kubelet 后会在/etc下生成文件目录/etc/kubernetes/manifests/
$ kubeadm init \
--apiserver-advertise-address=172.16.136.16 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.14.6 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
记录控制台的输出(如下),部署work的时候要用:
kubeadm join 172.16.136.16:6443 --token a9s4qx.9g2u5ukwocbjc17f
–discovery-token-ca-cert-hash sha256:90a12681c259a65c45649f95f9328e78da832307a98246b0771463bee26897e3
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
如果下载失败,可以修改yml中的镜像地址
quay.io修改为quay-mirror.qiniu.com
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannelimage
initContainers:
- name: install-cni
image: quay-mirror.qiniu.com/coreos/flannel:v0.12.0-amd64
部署网络插件flannel
$ kubectl apply -f kube-flannel.yml
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:这个在master init初始化时会有提示,更换为自己的IP和token。
kubeadm join 172.16.136.16:6443 --token a9s4qx.9g2u5ukwocbjc17f
–discovery-token-ca-cert-hash sha256:90a12681c259a65c45649f95f9328e78da832307a98246b0771463bee26897e3
$ kubectl get nodes
dashboard也会存在镜像无法拉取的情况,默认镜像国内无法访问,修改kubernetes-dashboard.yaml修改镜像地址为:
先将文件下载下来:
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
修改原image 地址
k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
修改为
roeslys/kubernetes-dashboard-amd64:v1.10.1
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: roeslys/kubernetes-dashboard-amd64:v1.10.1
ports:
- containerPort: 8443
protocol: TCP
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:不修改的话外部不能访问。
修改type,NodePort,注意冒号后面要用tab分隔
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30000
selector:
k8s-app: kubernetes-dashboard
$ kubectl apply -f kubernetes-dashboard.yaml
创建service account并绑定默认cluster-admin管理员集群角色:
源也可以换成gcr.azk8s.cn/google_containers/kubernetes-dashboard-amd64:v1.10.1
$ 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}')
记录保存token上面生成的令牌,使用令牌登录。
必须开通网络配置,才能在进行公网访问
端口范围写 30000/30000
登录地址(如果谷歌打不开就用火狐浏览器)
https://master_ip:30000/
这里使用了github上一键安装的开源工具
https://github.com/shikanon/kubeflow-manifests?spm=a2c6h.12873639.0.0.54bb1df6MU2qFL
$ git clone https://github.com/shikanon/kubeflow-manifests.git
新建命名空间安装kubeflow需要
kubectl create namespace kubeflow
如果需要用local-path文件夹下的yaml文件生成
$ cd kubeflow-manifests
$ cd local-path
$ kubectl apply -f local-path-storage.yaml
生成yaml
$ cd …
$ python run.py
启动
$ cd yaml
$ kubectl apply -f .
查看结果
$ kubectl get pod -nkubeflow
当所有pod running后就安装成功了
$ kubectl get pods,svc -n istio-system
80映射的端口是31380
同样也要更新阿里云的网络配置
唯一需要需要注意的是谷歌的镜像地址拉不下来
镜像地址用亚马逊的镜像gcr.azk8s.cn
gcr.azk8s.cn/kubeflow-images-public/tensorflow-1.13.1-notebook-cpu:v0.5.0
创建好以后点击connect,进入jupyter notebook
其他的功能还没有研究
修改好的yml文件已经上传到了网盘
链接:https://pan.baidu.com/s/1GgpyLD1kNpWcyQsJkWU7yw 密码:ioqq
参考文献
https://www.jianshu.com/p/f4ac7f4555d3
https://developer.aliyun.com/article/740721
https://github.com/shikanon/kubeflow-manifests?spm=a2c6h.12873639.0.0.54bb1df6MU2qFL