双机环境部署Kubernetes

本文使用kubeadm在虚机上部署一master一node的Kubernetes(k8s)集群。

0x01 环境
首先是创建环境,笔者使用的是两台8核8G内存的虚机,系统是Ubuntu 16.04。具体配置信息如下:

{
  "accountId": 278444,
  "createDate": "2017-08-25T13:04:47+08:00",
  "domain": "softlayer.com",
  "fullyQualifiedDomainName": "kube-master-ed.softlayer.com",
  "hostname": "kube-master-ed",
  "id": 38195879,
  "lastPowerStateId": null,
  "lastVerifiedDate": null,
  "maxCpu": 8,
  "maxCpuUnits": "CORE",
  "maxMemory": 8192,
  "metricPollDate": null,
  "modifyDate": null,
  "provisionDate": null,
  "startCpus": 8,
  "statusId": 1001,
  "uuid": "d81932a1-cfd5-4a22-8599-7932f5774e74",
  "globalIdentifier": "4aee1c95-a1fc-4693-a086-bb6eaa55e30c"
}

master_ip10.112.116.123node1_ip10.113.205.195。接下来的2~3步的安装部署都要在两台VM上执行。

0x02 安装Docker
Docker有很多发行版本,我选择的是17.06.1-ce版本。具体安装过程如下:

# Add repo key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  
sudo add-apt-repository \  
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update  
# Install docker-ce
sudo apt-get install docker-ce  

0x03 安装kube命令行相关工具
k8s相关的工具包括:kubectl是kubernets的命令行工具,kubelet是kubernetes中的worker组件,负责在各个节点上收集信息和执行任务。kubeadm工具提供一键部署k8s的方法。

# Install kubectl
sudo snap install kubectl --classic  
# Install kubelet, kubeadm
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -  
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list  
deb http://apt.kubernetes.io/ kubernetes-xenial main  
EOF  
apt-get update  
apt-get install -y kubelet kubeadm  

0x04 配置Cluter环境
使用kubeadm init来初始化master环境,CIDR options是为了接下来的pod network add-on做准备。

kubeadm init --pod-network-cidr=192.168.0.0/16 --skip-preflight-checkskubeadm init --pod-network-cidr=192.168.0.0/16  

如果成功启动,可以看到如何加入cluster的方法:kubeadm join --token <token> <master-ip>:<master-port>

kubeadm init

接着部署网络,我选择的network add-on是Calico。直接部署pods即可:

kubectl apply -f http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml  

apply<em>network</em>add_on

等待新加入的pod和kube-dns状态转换为Running时,就表明网络配置成功。
这个时候切换到node1机器上,使用kubeadm将node1节点加入到cluster中。

kubeadm join --token d8fb64.052e0bf570346675 169.50.70.124:6443  

join_cluster

当成功执行后,再切换回master查看node情况。

kubectl get nodes  

nodes_status

可以看到,node1已经成功加入到cluster当中。

0x05 Test

kubectl create namespace sock-shop  
kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"  

等待相关的pod成功创建,可以看到这个pod都部署在了node1机器上。 pods_status

我们使用 kubectl -n sock-shop get svc front-end 查看前端的端口。

services

然后测试一下结果。

curl_result

整个部署的过程十分简单和顺利。