基于K8S的OpenStack部署实践
Openstack、Docker和Kubernetes是当前IaaS和PaaS领域最为火热的技术。随着Docker容器技术的兴起,容器编排调度引擎成为当前十分抢眼的技术,这其中尤以Google开源的Kubernetes(K8S)以Production-ready和各种完善的功能而最为人熟值。在容器及其编排引擎的推动下,Openstack的主流部署模式也在发生变化,目前的Openstack与Docker容器和Kubernetes已经形成了一种你中有我,我中有你的局面,本文主要探讨如何借助Openstack的Kolla-kubernets项目,通过Kubernetes对Openstack进行容器化部署,并最终部署一套ALL-IN-ONE类型的Openstack容器云。
一、Kubernetes集群部署主机及系统软件需求
■ 主机配置需求
1、操作系统:CentOS7.3,最小安装方式安装
2、网卡:2
3、内存:8GB可用内存
4、硬盘:40GB
■ 软件依赖
1、docker==1.12.5
2、helm >= 2.4.1
3、kubectl >=1.6.1
4、kubeadm >=1.6.1
5、kubelet >=1.6.1
6、kubernets-cni >=0.5.1
7、kolla-ansible==4.0.0
8、kolla-kubernets==0.6.0
9、kolla==4.0.0
本文所有操作都在非root用户权限下进行,如果以root用户权限进行本文介绍的部署操作,则在helm安装部分会出错。
二、Kubernetes集群部署
■ 系统环境配置
1、关闭系统防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
2、关闭SELinux
sudo setenforce 0
sudo sed -i 's/enforcing/disabled/g' /etc/selinux/config
3、网络配置
修改/etc/sysctl.conf,如下:
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind=1
net.unix.max_dgram_qlen=128
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
■ Docker运行时环境安装准备
1、准备Docker安装源并安装Docker
sudo tee /etc/yum.repos.d/docker.repo << 'EOF'
[docker_repo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=0
EOF
//安装相关的依赖包
sudo yum install python-devel libffi-devel gcc openssl-devel git \
python-pip epel-release
//安装Docker
sudo yum install docker-engine-1.12.5 docker-engine-selinux-1.12.5
2、配置Docker引擎
Docker在CentOS中安装后默认的StorageDrive为lvm-loop模式的DeviceMapper,这里推荐采用lvm-direct模式的DeviceMapper。假设系统中规划由于存储Docker镜像的存储块为/dev/sdb,则Docker的lvm-direct模式DeviceMapper存储引擎配置如下:
sudo pvcreate /dev/sdb
sudo vgcreate docker /dev/sdb
sudo lvcreate --wipesignatures y -n thinpool docker -l 95%VG
sudo lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
sudo lvconvert -y --zero n -c 512K --thinpool docker/thinpool
--poolmetadata docker/thinpoolmeta
sudo echo -e "activation {\nthin_pool_autoextend_threshold=80
\nthin_pool_autoextend_percent=20\n}">/etc/lvm/profile/docker-thinpool.profile
sudo lvchange --metadataprofile docker-thinpool docker/thinpool"
sudo lvs -o+seg_monitor"
配置Docker引擎的MountFlags标志:
sudo mkdir /etc/systemd/system/docker.service.d
sudo echo -e "[Service]\n MountFlags=shared" >/etc/systemd/system
/docker.service.d/kolla.conf
配置Docker使用lvm-direct存储引擎、使用国内的DockerHub镜像(这里配置的为阿里云的DockerHub镜像)以及使用本地的Docker镜像Registry,如下:
sudo sed -i 's/\/usr\/bin\/dockerd/\/usr\/bin\/dockerd
--registry-mirror=https:\/\/v4wev6hv.mirror.aliyuncs.com
--insecure-registry 192.168.125.30:4000
--storage-driver=devicemapper
--storage-opt=dm.thinpooldev=\/dev\/mapper\/docker-thinpool
--storage-opt=dm.use_deferred_removal=true
--storage-opt=dm.use_deferred_deletion=true/'
/usr/lib/systemd/system/docker.service
3、启动Docker引擎
sudo /usr/bin/systemctl daemon-reload
sudo /usr/bin/systemctl start docker
sudo /usr/bin/systemctl enable docker
4、创建Docker本地Registry
sudo docker pull registry
sudo mkdir /data/registry
sudo docker run -d -v /data/registry:/var/lib/registry -p 4000:5000
--restart=always --name local_registry registry:latest
5、通过Kolla项目下载Openstack的Docker镜像源
在正式通过Kubernetes编排部署之前,需要准备好Openstack各个服务项目的容器镜像,本文采用基于Ocata版本的Kolla4.0编译(编译类型为Source)得到的Openstack镜像(下载地址为:http://tarballs.openstack.org/kolla/images/centos-source-registry-ocata.tar.gz),将centos-source-registry-ocata.tar.gz下载并上传到系统后,将其直接解压至Docker本地Registry的目录/data/registry即可:
sudo tar zxvf centos-source-registry-ocata.tar.gz -C /data/registry/
可以通过curl来访问验证本地Registry是否正常:
curl http:// 192.168.125.30:4000/v2/_catalog
■ 安装Kubernetes集群软件
官方推荐的Kubernetes集群部署软件安装如下:
//准备kubernets安装源,位于google的packages管理仓库中
sudo tee /etc/yum.repos.d/kubernetes.repo<<EOF
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
//采用yum直接安装
sudo yum install -y ebtables kubeadm kubectl kubelet kubernetes-cni
不翻墙的情况下,这种方式在国内几乎是不可能安装成功的,要访问google的服务器简直难于上青天!下面介绍一种相对简单可行的Kubernetes安装方式,首先确保你可以访问www.google.com,然后访问如下地址:
https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/primary.xml
该地址显示的是XML文本,在其中可以找到需要安装的各个Kubernetes软件包源地址,如下:
利用上图中红色实线勾画部分构造RPM包下载地址(添加),如下:
https://packages.cloud.google.com/yum/pool/23961d0f7dca1ed118b948195f2fb5dd7a07503d69d7d8ab4433219ea98d033e-kubeadm-1.6.1-0.x86_64.rpm
在浏览器中输入上述地址,浏览器将会自动下载kubeadm-1.6.1-0.x86_64.rpm软件包,重复上述过程,下载全部所需的RPM包,如下:
将上述软件包全部上传到CentOS系统中,可以制作一个本地YUM仓库,然后通过YUM进行安装,也可以通过rpm命令行进行安装。记得通过yum形式安装ebtables和socat!
■ Kubernetes镜像获取
在Kubernetes1.6中,Kubernetes集群已经不再以系统进程形式部署在系统中了,而是以Docker容器形式部署。尽管kubeadm init命令会自动到Google容器仓库中Pull所需的镜像,但是这种方式绝对会让你崩溃到想放弃Kubernetes!因此,最好在运行kubeadm init之前准备好全部所需的镜像,在部署Kubernetes1.6.1时,需要的Kubernetes镜像如下(Kubernetes1.6.1仅需要以下镜像):
获取上述镜像的一个可行方法,就是通过github和dockerhub相互配合,在github上制作编译镜像的Dockerfile文件,然后自己账户下的dockerhub与github关联起来,并通过dockerhub从github上提取Dockerfile文件并编译Docker镜像,由于Dockerhub服务器本身位于海外,因此编译镜像的速度还是可以接受的,待Dockerhub编译完成后,便可通过docker pull命令将其抓取到本地,之后再通过docker tag命令对抓取到本地的镜像进行重命名即可,具体制作过程可参考:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/这篇博客。如果安装的是Kubernetes1.6.1,则可直接到笔者的Dockerhub中下载上述Kubernetes镜像(https://hub.docker.com/r/warrior/),如下:
可通过如下命令进行镜像提取:
docker pull warrior/k8s-dns-dnsmasq-nanny-amd64:1.14.1
//镜像重命名
docker tag warrior/k8s-dns-dnsmasq-nanny-amd64:1.14.1 \
gcr.io/ google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1
笔者在https://hub.docker.com/r/warrior/中的镜像编译Dockerfile文件位于Github项目https://github.com/ynwssjx/K8s-images中,有兴趣的读者可自行查看,其实Dockerfile文件内容非常简单,仅有一个FROM语句,如:FROM gcr.io/google_containers/etcd-amd64:3.0.17
其实在制作Kubernetes镜像时,有个问题就是如何知道kubeadm init命令所需的镜像版本号。在/etc/kubernetes/manifests目录中,有几个yaml文件,其中的image字段定义了所需的版本号,如下:
关于其他镜像的版本号查询,可参考前文提及的博客。
■ Kubernetes集群初始化
在Kubernetes集群中,POD和Service在创建时都会自动分配网络IP地址,这里假设POD网段为10.1.0.0/16,Service网段为10.3.3.0/24。设置Kubernetes集群的DNS 服务器,如下:
sudo sed -i 's/10.96.0.10/10.3.3.10/g' \
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Kubernetes使用服务网段的x.x.x.10IP地址来作为DNS服务器地址,1到9被预留作为Kubernetes后续基础服务的扩展需求。启动kubelet服务,如下:
sudo systemctl daemon-reload
sudo systemctl stop kubelet
sudo systemctl enable kubelet
sudo systemctl start kubelet
此时如果通过systemctl status kubelet来查看kubelet的启动状态,将会发现kubelet启动失败,这个时候先不用在意报错,继续后续操作。使用kubeadm命令行进行Kubernetes集群初始化,如下:
sudo kubeadm init --pod-network-cidr=10.1.0.0/16 \
--service-cidr=10.3.3.0/24 \
--apiserver-advertise-address 192.168.125.30
apiserver-advertise-address为API Server的监听地址
等待一段时间,看到successful即说明Kubernetes集群初始化完成。加载kubeadm认证到系统环境变量中,如下:
mkdir -p $HOME/.kube
sudo -H cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo -H chown $(id -u):$(id -g) $HOME/.kube/config
此时,再开启一个终端,su到部署Kubernetes集群的用户home目录,输入如下命令,即可观察到Kubernetes集群中PODs变化过程:
watch -d kubectl get pods --all-namespaces -o wide
在当前阶段,Kolla-kubernets项目推介使用的Kubernetes集群网络驱动是Canal。部署Canal网络驱动,如下:
sudo curl -L https://raw.githubusercontent.com/projectcalico\
/canal/master/k8s-install/1.6/rbac.yaml -o rbac.yaml
sudo kubectl apply -f rbac.yaml
sudo curl -L https://raw.githubusercontent.com/projectcalico/canal\
/master/k8s-install/1.6/canal.yaml -o canal.yaml\
sudo sed -i "s@10.244.0.0/16@10.1.0.0/16@" canal.yaml
sudo kubectl apply -f canal.yaml
Canal网络驱动部署成功后,Kubernetes的kube-system命名空间中的全部pods应该是running状态(在此之前,dns并非running状态),如下:
因为此处采用的是AIO部署模式,而默认情况下Kubernetes的Master节点是不会被kube-scheduler分配PODs到其上的运行的,为了让PODs在Master上也能够运行,对Master进行untaint操作,如下:
kubectl taint nodes --all=true \
node-role.kubernetes.io/master:NoSchedule-
■ Kubernetes集群验证
待kube-system命名空间中全部pods处于running状态之后,通过kubectl命令启动一个busybox容器,在该容器中进行DNS查询操作,如果操作成功则说明Kubernetes集群部署成功,否则Kubernetes集群是存在问题的,需要检查上述各个步骤。验证过程如下:
kubectl run -i -t $(uuidgen) --image=busybox --restart=Never
//进入容器后,执行nslookup操作
# nslookup kubernetes
Server: 10.3.3.10
Address 1: 10.3.3.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes
Address 1: 10.3.3.1 kubernetes.default.svc.cluster.local
如果能够看到上述信息,说明Kubernetes集群部署是成功的,否则便是有问题的。
三、部署kolla-kubernets
■ 覆盖默认的RBAC设置
通过kubectl replace命令进行默认RBAC设置的覆盖,如下:
kubectl update -f <(cat <<EOF
apiVersion: rbac.authorization.k8s.io/v1alpha1
kind: ClusterRoleBinding
metadata:
name: cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: Group
name: system:masters
- kind: Group
name: system:authenticated
- kind: Group
name: system:unauthenticated
EOF
)
■ 安装部署Helm
Helm是Kubernetes中的包管理器,类似yum包管理工具,yum用来安装RPM包,而Helm用来安装charts,这里的charts便类似RPM软件包。Helm分为客户端和服务器端,Helm的服务器端称为tiller,服务器端在Kubernetes中以Docker容器形式运行,为了便于Helm安装,可以实先将Tiller的容器镜像下载到本地,可使用如下命令下载:
docker pull warrior/kubernetes-helm:2.4.1
docker tag warrior/kubernetes-helm:2.4.1 \
gcr.io/kubernetes-helm/tiller:v2.4.1
安装Helm最简单的方式如下:
sudo curl -L https://raw.githubusercontent.com/kubernetes/helm\
/master/scripts/get > get_helm.sh
sudo chmod 700 get_helm.sh
sudo ./get_helm.sh
sudo helm init
Hel安装完成后,可以看到kube-system命名空间中新增了一个running状态的POD,名称为tiller-deploy-xxx,如下:
Helm安装成功后,通过helm version即可看到客户端和服务器端的信息,如下:
■ 安装kolla-ansible和kolla-kubernets
Clone社区Kolla-ansible源代码,如下:
git clone http://github.com/openstack/kolla-ansible
git clone http://github.com/openstack/kolla-kubernetes
安装kolla-ansible和kolla-kubernets,如下:
sudo pip install -U kolla-ansible/ kolla-kubernetes/
复制默认的kolla配置文件到/etc目录,如下:
sudo cp -aR /usr/share/kolla-ansible/etc_examples/kolla /etc
复制 kolla-kubernetes 配置文件至/etc目录,如下:
sudo cp -aR kolla-kubernetes/etc/kolla-kubernetes /etc
为Openstack集群各个项目和用户生成密码文件,如下:
sudo kolla-kubernetes-genpwd
在kubernets中创建一个独立的密码空间kolla,如下:
kubectl create namespace kolla
将AIO节点标记为控制节点和计算节点,如下:
kubectl label node $(hostname) kolla_compute=true
kubectl label node $(hostname) kolla_controller=true
修改/etc/kolla/globals.yml配置文件,其中:network_interface和neutron_external_interface两个变量需要用户指定,network_interface是管理接口(如eth0),默认也是Openstack各个服务项目的API接口,neutron_external_interface是Neutron项目用于外网桥接的物理接口(如eth1),该接口上不要手工配置IP地址。
将需要启动的服务项目添加到/etc/kolla/globals.yml的末尾,如下:
cat <<EOF > add-to-globals.yml
kolla_install_type: "source"
tempest_image_alt_id: "{{ tempest_image_id }}"
tempest_flavor_ref_alt_id: "{{ tempest_flavor_ref_id }}"
neutron_plugin_agent: "openvswitch"
api_interface_address: 0.0.0.0
tunnel_interface_address: 0.0.0.0
orchestration_engine: KUBERNETES
memcached_servers: "memcached"
keystone_admin_url: "http://keystone-admin:35357/v3"
keystone_internal_url: "http://keystone-internal:5000/v3"
keystone_public_url: "http://keystone-public:5000/v3"
glance_registry_host: "glance-registry"
neutron_host: "neutron"
keystone_database_address: "mariadb"
glance_database_address: "mariadb"
nova_database_address: "mariadb"
nova_api_database_address: "mariadb"
neutron_database_address: "mariadb"
cinder_database_address: "mariadb"
ironic_database_address: "mariadb"
placement_database_address: "mariadb"
rabbitmq_servers: "rabbitmq"
openstack_logging_debug: "True"
enable_haproxy: "no"
enable_heat: "no"
enable_cinder: "yes"
enable_cinder_backend_lvm: "yes"
enable_cinder_backend_iscsi: "yes"
enable_cinder_backend_rbd: "no"
enable_ceph: "no"
enable_elasticsearch: "no"
enable_kibana: "no"
glance_backend_ceph: "no"
cinder_backend_ceph: "no"
nova_backend_ceph: "no"
EOF
cat ./add-to-globals.yml | sudo tee -a /etc/kolla/globals.yml
如果是在虚拟机上进行部署,则需要使用qemu虚拟化引擎,如下:
sudo mkdir /etc/kolla/config
sudo tee /etc/kolla/config/nova.conf<<EOF
[libvirt]
virt_type=qemu
cpu_mode=none
EOF
生成默认的Openstack各个项目配置文件,如下:
sudo kolla-ansible genconfig
为Openstack各个项目创建Kubernetes秘钥并将其注册到Kubernetes集群中,如下:
kolla-kubernetes/tools/secret-generator.py create
创建并注册kolla的config map,如下:
kollakube res create configmap \
mariadb keystone horizon rabbitmq memcached nova-api nova-conductor\
nova-scheduler glance-api-haproxy glance-registry-haproxy \
glance-api glance-registry neutron-server neutron-dhcp-agent \
neutron-l3-agent neutron-metadata-agent neutron-openvswitch-agent \
openvswitch-db-server openvswitch-vswitchd nova-libvirt nova-compute\
nova-consoleauth nova-novncproxy nova-novncproxy-haproxy\
neutron-server-haproxy nova-api-haproxy cinder-api cinder-api-haproxy\
cinder-backup inder-scheduler cinder-volume iscsid tgtd keepalived\
placement-api placement-api-haproxy
启用resolv.conf解决方法,如下:
kolla-kubernetes/tools/setup-resolv-conf.sh kolla
编译Helm的microcharts、service charts和 metacharts,如下:
kolla-kubernetes/tools/helm_build_all.sh ./
编译过程会花费一定时间,编译完成会在当前目录上产生很多.tgz的文件,其数目至少要大于150个。
创建一个本地cloud.yaml文件,用户安装部署Helm的charts,如下:
global:
kolla:
all:
docker_registry: 192.168.128.13:4000 //本地registry仓库地址
image_tag: "4.0.0"
kube_logger: false
external_vip: "192.168.128.13"
base_distro: "centos"
install_type: "source"
tunnel_interface: "ens34" //管理接口
resolve_conf_net_host_workaround: true
keystone:
all:
admin_port_external: "true"
dns_name: "192.168.128.13"
public:
all:
port_external: "true"
rabbitmq:
all:
cookie: 67
glance:
api:
all:
port_external: "true"
cinder:
api:
all:
port_external: "true"
volume_lvm:
all:
element_name: cinder-volume
daemonset:
lvm_backends:
- '192.168.128.13': 'cinder-volumes' //cinder后端VG名称
ironic:
conductor:
daemonset:
selector_key: "kolla_conductor"
nova:
placement_api:
all:
port_external: true
novncproxy:
all:
port: 6080
port_external: true
openvwswitch:
all:
add_port: true
ext_bridge_name: br-ex
ext_interface_name: ens41 //Neutron外网桥接网口
setup_bridge: true
horizon:
all:
port_external: true
cloud.yaml文件需要根据用户各自的环境进行修改,上述文件中的192.168.128.13是笔者管理网口ens34上的IP地址,在使用过程中需要进行相应的修改。
■ 使用Helm在Kubernetes上部署Openstack
首先部署MariaDB,并等待其进入running状态,如下:
helm install --debug kolla-kubernetes/helm/service/mariadb \
--namespace kolla --name mariadb --values ./cloud.yaml
待数据库稳定后,部署其他的Openstack服务,如下:
helm install --debug kolla-kubernetes/helm/service/rabbitmq \
--namespace kolla --name rabbitmq --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/memcached \
--namespace kolla --name memcached --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/keystone\
--namespace kolla --name keystone --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/glance \
--namespace kolla --name glance --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/cinder-control\
--namespace kolla --name cinder-control --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/horizon \
--namespace kolla --name horizon --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/openvswitch \
--namespace kolla --name openvswitch --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/neutron \
--namespace kolla --name neutron --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/nova-control\
--namespace kolla --name nova-control --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/service/nova-compute \
--namespace kolla --name nova-compute --values ./cloud.yaml
当nova-compute进入running状态后,创建cell0数据库,如下:
helm install --debug kolla-kubernetes/helm/microservice\
/nova-cell0-create-db-job --namespace kolla --name \
nova-cell0-create-db-job --values ./cloud.yaml
helm install --debug kolla-kubernetes/helm/microservice\
/nova-api-create-simple-cell-job --namespace kolla \
--name nova-api-create-simple-cell --values ./cloud.yaml
当上述全部POD进入running状态后,部署Cinder LVM。这里假设系统上已经有一个名为cinder-volumes的VG存在,如果还没有cinder-volume这个VG,则需要事先创建该VG,如下:
pvcreate /dev/sdb /dev/sdc
vgcreate cinder-volumes /dev/sdb /dev/sdc
安装部署cinder-volume,如下:
helm install --debug kolla-kubernetes/helm/service/cinder-volume-lvm\
--namespace kolla --name cinder-volume-lvm --values ./cloud.yaml
如果要删除helm部署的charts,如cinder-volume-lvm,则通过命令:
helm delete cinder-volume-lvm --purge
即可从kubernets集群中清除cinder-volume相关的PODs。
至此,全部Openstack服务已经部署完成,在操作Openstack集群之前,先等待所有Kubernetes集群中的PODs处于running状态,如下:
查看kubernets集群中的全部deployment,如下:
查看kubernets集群中的全部service,如下:
可以看到,每个service都被自动分配了10.3.3.0/24网段的IP地址,并且可以看到各个service对应的端口。在确认Kubernetes的各个API对象正常运行后,便可通过Openstack命令行客户端进行Openstack集群操作。首先,生成并加载openrc文件,如下:
kolla-kubernetes/tools/build_local_admin_keystonerc.sh ext
source ~/keystonerc_admin
通过kolla-ansible提供的init-runonce脚本初始化Openstack,并launch一个VM,如下:
kolla-ansible/tools/init-runonce
创建一个FloatingIP地址,并将其添加到VM上,如下:
openstack server add floating ip demo1 $(openstack floating ip \
create public1 -f value -c floating_ip_address)
查看创建的VM,如下:
登录Dashboard(http://192.168.128.13),如下:
在dashboard上查看创建的实例,如下:
创建一个块存储,并将其attach到实例demo1上,如下:
到此,Ocata版本的Openstack已经成功部署在Kubernetes集群上。由于诸多原因,目前Kolla-kubernets项目仍然不具备生产环境部署条件,社区目前也仅支持AIO的开发实验性质的部署,相信随着K8S的兴趣,Kolla-kubernets项目的重视程度也会与日俱增,而且可以预言,在不久的将来,通过K8S部署Openstack容器云将会是Openstack的一大主流方向!
参考文档:
1、https://github.com/openstack/kolla-kubernetes/blob/master/doc/deployment-guide.rst
2、https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/
3、http://yoyolive.com/2017/02/27/Kubernetes-1-5-3-Local-Install/
4、https://github.com/projectcalico/canal/tree/master/k8s-install
5、https://kubernetes.io/docs/admin/kubeadm/
6、https://kubernetes.io/docs/getting-started-guides/kubeadm/
更多推荐
所有评论(0)