Ubuntu环境搭建Kubernetes平台

1 虚拟机环境准备

按照如下步骤先制作一个虚拟机镜像,然后使用镜像创建集群虚拟机节点。

1.1 创建虚拟机

使用ISO在VMware上面安装一台虚拟机,将该虚拟机导出为.ovf格式的模板文件,之后安装虚拟机时,可直接导入模板文件即可。
本次是安装的ubuntu 16.04.4 LTS版本的虚拟机,内核版本为4.4.0-116-generic。安装时勾选了OpenSSH、DNS server、基础软件包共3个选项,然后手动配置了网络信息。
虚拟机的规格:4U8G40G:也即 4个CPU,8G内存,40G硬盘。
磁盘分区:/ 38.5G,SWAP 1G,/boot 0.5G,其中/和SWAP采用逻辑卷形式挂载,/boot采用磁盘标准分区。 该分区采用的是ubuntu 16.04.4安装时的默认分区。

1.2 安装docker-ce 17.03

本次测试安装了适用于ubuntu 16.04系统的docker 17.03.0-ce版本。Kubernetes官网上面关于Ubuntu上安装docker软件的介绍:
https://kubernetes.io/docs/setup/independent/install-kubeadm/
使用源安装指定版本的docker:

// 更新源
apt-get update
// 安装依赖项
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
// 下载并添加apt的认证信息
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
// 根据操作系统版本信息添加对应的docker源,最终会添加到/etc/apt/sources.list文件中,也可以直接在该文件中进行配置
add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
// 更新源,查找17.03版本对应的名称,安装对应的docker版本,通过apt-cache madison docker-ce命令可以查找该源下所有可以安装的docker-ce的版本
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')

注:如下网址为docker官网关于ubuntu上安装docker版本的介绍。
https://docs.docker.com/install/linux/docker-ce/ubuntu/

1.3 配置普通用户无需sudo执行docker命令

默认情况下docker的运行需要使用root用户,普通用户需要使用sudo命令执行docker相关的命令。为了能够让普通用户不需要添加sudo就可以直接执行docker命令,需要进行一下配置。如下链接为docker官网上关于对应配置介绍的地址。
https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user

创建一个docker用户组,将自己的操作用户(下面用$USER表示)添加到docker用户组中。其实在Docker软件安装过程中,会默认创建一个docker用户组,可以通过查看/etc/group文件是否存在docker判断。如果没有,就创建一个docker用户组,可以执行如下命令创建:

sudo groupadd docker

添加自己的操作用户($USER,比如boss)到docker用户组中:

sudo usermod -aG docker $USER

退出当前用户然后再重新登陆,使得修改生效。有的版本需要重新启动虚拟机才能够生效。之后就可以执行不带sudo的docker命令,如可以执行docker info或docker images等查看,是否正常执行。

1.4 配置docker服务开机自启动

目前大部分Linux系统(如RHRL,CentOS,Fedora,Ubuntu 16.04及以上版本)均使用systemd来管理服务的开机启动。Ubuntu 14.10及更低版本使用upstart命令。
使用systemd方式设置开机自启动和取消自开机启动:
// 设置docker服务开机启动命令

sudo systemctl enable docker

// 取消docker服务开机启动命令

sudo systemctl disable docker

使用uptart方式的情况,docker已经自动配置为开机自启动了。如果要禁止开机自启动需要执行:

echo manual | sudo tee /etc/init/docker.override

使用chkconfig命令设置开机自启动和取消开机自启动:
// 设置docker服务开机启动命令

sudo chkconfig docker on

// 取消docker服务开机启动服务

sudo chkconfig docker off

Suse11和Suse12Sp1系统即是使用chkconfig方式设置。

Docker服务其他的一些启动时的配置需要根据业务的具体情况进行配置。目前不需要配置采用默认值即可。平时常见的配置有:docker服务采用的驱动模式(ubuntu 16.04+默认采用overlay2驱动,CentOS默认采用devicemapper驱动),单个容器允许的系统日志大小和个数(当容器内服务异常时,日志将无限制输出,导致容器占有磁盘特别大,可能导致容器服务不可用,也可能导致宿主机磁盘不足),容器安全相关设置(允许的文件句柄个数等),默认文件系统设置(默认采用xfs文件系统),

1.5 虚拟机系统配置

DNS:取消自动生成DNS,不然,配置的域名可能会由于重新启动虚拟机或网络服务而被覆盖。
K8S在搭建时也会自动生成DNS相关配置项用于解析内部的service的域名。如果自动生成DNS会在重启网络或重启虚拟机的时候覆盖掉K8S的域名,导致服务不可用。不过该域名一般设置在容器内部,外部需要手动设置。搭建外部域名系统后,还是有必要禁止DNS自动生成域名,覆盖设置好的域名的。
Ubuntu 16.04系统,注销/etc/network/interfaces文件中的dns-nameservers字段。将DNS信息添加到/etc/resolvconf/resolv.conf.d/base文件中,可以保证dns信息不会被重新启动覆盖掉。
需要重新启动网络:

systemctl restart networking

重启启动resolvconf服务:

systemctl restart resolvconf

关闭swap:如果swap不关闭,可能会导致kubelet组件启动失败。
// 关闭swap

sudo swapoff -a

// 注销/etc/fstab中的swap,避免开机启动swap

sed -i “/ swap/ s/^/#/ ” /etc/fstab 

需要重新启动虚拟机生效。
关闭防火墙:避免K8S的Pod之间网络流量转发的时候被防火墙阻止,在部署开始时关闭防火墙,之后根据实际需要进行配置。
Ubuntu 16.04系统:

 ufw disable

1.6 小结

如上部分介绍了ubuntu 16.04系统上安装docker软件和相关的设置,由于所有的Kubernetes节点均需要进行这些操作,所以,可以根据以上步骤制作一个虚拟机镜像,之后直接使用镜像创建虚拟机即可。
尚需要完善的地方:
1) 虚拟机磁盘分区,需要根据业务情况进行具体的规划;
2) Docker软件的安装,最后将docker软件包和所有的依赖包下载到本地,采用本地安装的方式,可以保证所有环境上安装的版本和依赖包都是一致的,也可避免一些环境上不能够连接外网无法进行安装;
3) Docker启动项设置,需要之后根据业务的具体要求进行修改完善;
4) 其他设置(如系统安全设置,系统内核设置,业务要求的系统设置等)之后逐步完善。

2 使用kubeadm工具搭建Kubernetes集群环境

2.1 使用apt源安装kubeadm,kubelet和kubectl

搭建Kubernetes集群的所有虚拟机节点上面均需要安装kubeadm,kubelet和kubectl。可以先在主节点上面安装,之后需要将某些节点加入到集群中时,再在该节点上面安装这几个软件,之后再执行kubeadm join相关命令加入都集群中。
方法一:采用kubernetes官方源安装
如果采用官网上介绍的方法(如下所示)安装,需要连接packages.cloud.google.com,需要设置翻墙,不然会连接超时,导致安装失败。

  apt-get update && apt-get install -y apt-transport-https curl
   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 kubectl
   apt-mark hold kubelet kubeadm kubectl

官网地址:https://kubernetes.io/docs/setup/independent/install-kubeadm/
方法二:采用阿里云的源安装
采用Kubernetes中文社区中介绍的方法,使用阿里云的源进行安装,可以避免翻墙下载软件包。相关博文地址:https://www.kubernetes.org.cn/3895.html。该博文针对于kubeadm为1.10.1版本。由于kubeadm初始化Kubernetes集群的时候会从google的官网上下载Kubernetes的镜像包。如果没有翻墙,执行kubeadm init命令时会由于无法拉取镜像包而报错,所以需要提前下载对应的镜像包,并将镜像包load到kubernetes的主节点上(执行kubeadm init命令的虚拟机就是主节点,下面将直接使用主节点或master节点表示)。
由于我的工作机未安装翻墙软件,在该博文中有1.10.1版本的镜像包,也就安装了kubeadm 1.10.1用于测试,之后可以采用获取各组件的源码制作docker镜像的方式,逐步安装各组件,不采用kubeadm的形式。

如下为阿里云上面的Kubernetes源地址

# kubeadm及kubernetes组件安装源
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

将如上源地址添加到/etc/apt/source.list文件中,然后执行:

# 更新源,可以不理会gpg的报错信息
apt-get update   

执行如下命令,强制安装1.10.1版本的kubeadm,kubelet,kubectl:

version="1.10.1" && version=$(apt-cache madison kubeadm | grep ${version} | head -1 | awk '{print $3}') && sudo apt-get install -y kubeadm=${version} kubelet=${version} kubectl=${version} --allow-unauthenticated

在这里插入图片描述
至此,kubeadm工具和kubelet、kubectl组件就安装完成了。下一步就是使用kubeadm工具安装kubernetes集群了。

2.2 使用kubeadm安装Kubernetes集群

2.2.1 上传kubernetes镜像包到虚拟机所有节点

Kubernetes 1.10.1版本的镜像包已经下载完成放到了images文件夹的1.10.1文件夹下面(可以直接到这个网盘地址直接下载https://pan.baidu.com/s/1ZJFRt_UNCQvwcu9UENr_gw#list/path=%2F)。红线所示镜像包可以不需要,只是作为测试时使用。
在这里插入图片描述
向主节点(下面有时称为master节点)上传镜像包:
将images的1.10.1文件夹下的镜像包全部上传到集群主节点上面(比如上传/home/boss/images目录下面),登陆主节点,切入/home/boss/images目录,执行如下命令,将所有的docker镜像load到本地docker中:

//这里是数值1,不是字母l,请分开。 
for image in $(ls -1 | grep .tar$); do docker load -i ${image}; done

向其他节点(下面有时称为slave节点)上传镜像包:
将images的1.10.1文件夹下的cni-v2.0.4.tar,flannel-0.9.1.tar,k8s-dns-dnsmasq-nanny-amd64-1.14.8.tar,k8s-dns-kube-dns-amd64.tar,k8s-dns-sidecar-amd64.tar,kube-proxy-amd64_v1.10.1.tar,node-v3.0.5.tar,pause-amd64_3.1.tar 这8各镜像包上传到虚拟机slave节点上面(比如上传到/home/boss/images目录下面),逐个登陆所有slave节点,切入/home/boss/images目录,执行如下命令,将所有的docker镜像load到本地docker中:

//这里是数值1,不是字母l,请分开。
for image in $(ls -1 | grep .tar$); do docker load -i ${image}; done

至此所有镜像包就上传完成,下一步进行环境搭建。

2.2.2 修改主机名

由于Kubernetes是使用主机名来和各个节点进行通信,并进行区分的。所以,集群中每个节点的主机名称必须不一样。
通过执行如下命令到每一个节点上面修改主机名:

 sudo hostnamectl set-hostname ${hostname}   // ${hostname}为设置的主机名

执行完成之后需要退出连接,然后重新连接该节点,使得修改生效。然后执行:

sudo hostname

查看主机名称是否和设置的一致。
建议再重新启动一下虚拟机,保证设置的主机名称不会因为重新启动虚拟机而改变。有些Linux系统上,当采用dhcp方式获取虚拟机IP的时候,再DHCP的配置文件中有关于dhcp服务启动时重新设置主机名的选项。所以,这个地方一定要注意。

2.2.3 执行kubeadm init初始化kubernetes master节点

因为集群网络要使用canal网络,需要在初始化时加上网络配置参数,设置kubernetes的子网为10.244.0.0/16,注意此处不要修改为其他地址,因为这个值与后续的canal的yaml值要一致,如果修改,请一并修改。
在主节点上面执行如下命令创建kubernetes环境:

kubeadm init --kubernetes-version=1.10.1 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.0.2.87 --node-name=ubuntu-master --ignore-preflight-errors=ImagePull

说明:
–kubernetes-version:指定要安装的kubernetes版本
–pod-network-cidr:指定kubernetes内部pod使用的IP范围,必须指定
–apiserver-advertise-address:指定apiserver接听的地址,该地址必须为主节点ip,必须配置
–node-name:指定主节点的名称
–ignore-preflight-errors:由于采用本地的镜像包,对于执行过程中报出的拉去镜像失败错误进行忽略,否则会安装失败。
在这里插入图片描述

然后执行如下命令来配置kubectl。配置过的用户才可以使用kubectl命令,所以,需要把常用操作用户(如boss)和root用户均配置一下,配置时只需切换到对应用户操作即可。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

这样master的节点就配置好了,并且可以使用kubectl来进行各种操作了,根据上面的提示接着往下做,将slave节点加入到集群。

2.2.4 Slave节点加入集群

在slave节点执行如下的命令,将slave节点加入集群,正常的返回信息如下:
该命令在初始化master节点的提示信息中有,下面的命令只是一个示例。

kubeadm join 10.0.2.87:6443 --token j7o4jz.nc9krizb6v6dpksy --discovery-token-ca-cert-hash sha256:fb0eae25e6d94f760d0bda5bddb828e1fc8d40bd5f5f12fd4595c25d3743a8e8

# kubeadm join 10.0.2.87:6443 --token j7o4jz.nc9krizb6v6dpksy --discovery-token-ca-cert-hash sha256:fb0eae25e6d94f760d0bda5bddb828e1fc8d40bd5f5f12fd4595c25d3743a8e8
[preflight] Running pre-flight checks.
 [WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
[discovery] Trying to connect to API Server "10.0.2.87:6443"
[discovery] Created cluster-info discovery client, requesting info from "https:// 10.0.2.87:6443"
[discovery] Requesting info from "https:// 10.0.2.87:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "10.0.2.87:6443"
[discovery] Successfully established connection with API Server "10.0.2.87:6443"
This node has joined the cluster:
* Certificate signing request was sent to master and a response
  was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the cluster.

等待节点加入完毕。在主节点上执行kubectl get node命令可以查看节点加入状态
加入过程中状态:

# kubectl get node
NAME            STATUS     ROLES     AGE       VERSION
ubuntu-1        NotReady   <none>    6m        v1.10.1
ubuntu-2        NotReady   <none>    6m        v1.10.1
ubuntu-3        NotReady   <none>    6m        v1.10.1
ubuntu-master   NotReady   master    10m       v1.10.1

节点加入完毕后pod的状态:

root@Ubuntu-master:~# kubectl get pod -n kube-system -o wide
NAME             READY     STATUS    RESTARTS   AGE       IP              NODE
etcd-ubuntu-master    1/1       Running   0          21m       192.168.0.200   ubuntu-master
kube-apiserver-ubuntu-master   1/1       Running   0          21m       192.168.0.200   ubuntu-master
kube-controller-manager-ubuntu-master   1/1       Running   0          22m       192.168.0.200   ubuntu-master
kube-dns-86f4d74b45-wkfk2               0/3       Pending   0          22m       <none>          <none>
kube-proxy-6ddb4                        1/1       Running   0          22m       192.168.0.200   ubuntu-master
kube-proxy-7ngb9                        1/1       Running   0          17m       192.168.0.202   ubuntu-2
kube-proxy-fkhhx                        1/1       Running   0          18m       192.168.0.201   ubuntu-1
kube-proxy-rh4lq                        1/1       Running   0          18m       192.168.0.203   ubuntu-3
kube-scheduler-ubuntu-master            1/1       Running   0          21m       192.168.0.200   ubuntu-master

kubedns组件需要在网络插件完成安装以后会自动安装完成。

2.2.5安装网络插件canal

从canal官方文档参考,如下网址下载2个文件并且安装,其中一个是配置canal的RBAC权限,一个是部署canal的DaemonSet。

# kubectl apply -f  https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
clusterrole.rbac.authorization.k8s.io "calico" created
clusterrole.rbac.authorization.k8s.io "flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-calico" created
# kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/canal/canal.yaml
configmap "canal-config" created
daemonset.extensions "canal" created
customresourcedefinition.apiextensions.k8s.io "felixconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgpconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ippools.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "clusterinformations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworkpolicies.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networkpolicies.crd.projectcalico.org" created
serviceaccount "canal" created

查看canal的安装状态。

# kubectl get pod -n kube-system -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP              NODE
canal-fc94k                             3/3       Running   10         4m        192.168.0.201   ubuntu-1
canal-rs2wp                             3/3       Running   10         4m        192.168.0.200   ubuntu-master
canal-tqd4l                             3/3       Running   10         4m        192.168.0.202   ubuntu-2
canal-vmpnr                             3/3       Running   10         4m        192.168.0.203   ubuntu-3
etcd-ubuntu-master                      1/1       Running   0          28m       192.168.0.200   ubuntu-master
kube-apiserver-ubuntu-master            1/1       Running   0          28m       192.168.0.200   ubuntu-master
kube-controller-manager-ubuntu-master   1/1       Running   0          29m       192.168.0.200   ubuntu-master
kube-dns-86f4d74b45-wkfk2               3/3       Running   0          28m       10.244.2.2      ubuntu-3
kube-proxy-6ddb4                        1/1       Running   0          28m       192.168.0.200   ubuntu-master
kube-proxy-7ngb9                        1/1       Running   0          24m       192.168.0.202   ubuntu-2
kube-proxy-fkhhx                        1/1       Running   0          24m       192.168.0.201   ubuntu-1
kube-proxy-rh4lq                        1/1       Running   0          24m       192.168.0.203   ubuntu-3
kube-scheduler-ubuntu-master            1/1       Running   0          28m       192.168.0.200   ubuntu-master

可以看到canal和kube-dns都已经运行正常,一个基本功能正常的测试环境就部署完毕了。
此时查看集群的节点状态,版本为最新的版本v1.10.1。

# kubectl get node
NAME            STATUS    ROLES     AGE       VERSION
ubuntu-1        Ready     <none>    27m       v1.10.1
ubuntu-2        Ready     <none>    27m       v1.10.1
ubuntu-3        Ready     <none>    27m       v1.10.1
ubuntu-master   Ready     master    31m       v1.10.1

执行如下命令,让master也运行pod(默认master不运行pod),这样在测试环境做是可以的,不建议在生产环境如此操作。

#kubectl taint nodes --all node-role.kubernetes.io/master-
node "ubuntu-master" untainted
taint "node-role.kubernetes.io/master:" not found
taint "node-role.kubernetes.io/master:" not found
taint "node-role.kubernetes.io/master:" not found

3、安装helm工具(可选)

在这里插入图片描述

3.1 Helm 基本概念

Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为Kubernetes构建的应用,它包含几个基本概念
 Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件,
 Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。
 Repository:用于发布和存储 Chart 的仓库。

3.2 Helm 组件

Helm 采用客户端/服务器架构,有如下组件组成:
 Helm CLI 是 Helm 客户端,可以在本地执行
 Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期
 Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

3.3 Helm和tiller的安装

3.3.1 安装helm

从helm官网(https://github.com/helm/helm/releases)上下载helm二进制软件包(比如下载的是helm-v2.9.1-linux-amd64.tgz),上传到主节点上面(如/home/boss/helm目录下)。
执行如下命令切入helm软件包所在目录,解压软件包:

cd /home/boss/helm
tar -zxvf helm-v2.9.1-linux-amd64.tgz

解压后执行如下命令,将helm二进制文件拷贝到/usr/local/bin目录下:

cp linux-amd64/helm /usr/local/bin/helm

至此Helm安装完成,下面开始安装tiller。

3.3.2 安装tiller

首先给tiller创建使用Service Account,保证之后部署过程中,tiller有足够的权限在Kubernetes环境上进行安装。
1)创建一个名为tiller的Service Account

$ kubectl create serviceaccount tiller --namespace kube-system

2)授予名为tiller的Service Account集群管理员角色cluster-admin:
将tiller绑定至集群管理员角色的的yaml文件如下所示:

apiVersion: rbac.authorization.k8s.io/v1beta1 
kind: ClusterRoleBinding 
metadata: 
  name: tiller 
roleRef: 
  apiGroup: rbac.authorization.k8s.io 
  kind: ClusterRole 
  name: cluster-admin 
subjects: 
- kind: ServiceAccount 
  name: tiller 
  namespace: kube-system

通过执行kubectl create -f将授予tiller集群管理员角色:

$ kubectl create -f rbac-config.yaml

3)执行如下命令在Kubernetes环境中安装tiller:

helm init --service-account tiller --tiller-image <your-docker-registry>/tiller:2.9.1 --skip-refresh

其中/tiller:2.9.1为本地的tiller镜像。
参考博文:
https://www.kubernetes.org.cn/4009.html
https://github.com/helm/helm/blob/master/docs/install.md?spm=a2c4e.11153940.blogcont159601.23.6703174aK9TOsc&file=install.md
https://yq.aliyun.com/articles/159601#

4、搭建高可用的MySql集群

参考kubernetes中文社区文章:
https://www.kubernetes.org.cn/3985.html:
遇到的问题:创建后pod一直无法正常启动。
原因:nfs服务器共享的挂载目录权限问题,导致mysql启动脚本在执行chown命令时由于权限不足而执行失败。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值