虽然kubernetes安装方式有多种,推荐使用kubeadm安装,操作非常方便,极大的提高了部署效率,以下为测试验证过程。

软件版本:

组件名 版本 说明
kubernetes v1.13.3 使用版本为v1.13.2
docker 17.03.2-ce
etcd 3.2.24
calico v3.1.3
coredns 1.2.6
dashboard v1.10.0
haepster v1.4.2
influxdb v1.3.3

kubernetes最少需一个节点运行,此处以三个主机为例,详细角色信息如下:

主机名 角色 IP OS 基础组件(yum安装) 角色组件(master创建)
k8s-node1 master 192.168.100.101 CentOS7.3_x64 kubeadm,kubelet,kubectl,docker calico,proxy,etcd,coredns,apiserver,controller-manager,scheduler,dashboard,heapster,influxdb
k8s-node2 worker 192.168.100.102 CentOS7.3_x64 kubeadm,kubelet,kubectl,docker calico,proxy
k8s-node3 worker 192.168.100.103 CentOS7.3_x64 kubeadm,kubelet,kubectl,docker calico,proxy

一、各节点初始化

1. 关闭防火墙

1
2
3
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl stop iptables

注:若要开启防火墙,在放行kubernetes集群及服务所有端口以外,还需要配置防火墙的FORWARD链接默认ACCEPT

2. 永久关闭SELinux

1
2
3
setenforce 0     # 不重启的情况下
vim /etc/selinux/config
SELINUX=disabled

3. 同步集群系统时间

1
2
yum -y install ntp
ntpdate ntp4.aliyun.com

4. 设置内核参数及加载ipvs模块

因安装网络插件,需要系统开启以下参数

vim /etc/sysctl.conf

1
2
3
4
5
6
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.netfilter.nf_conntrack_max=1048576

sysctl -- system

若要启用ipvsadm,必须要加载以下内核模块

1
2
3
4
5
6
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

vim /etc/security/limits.conf

1
2
3
4
5
6
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft memlock unlimited
* hard memlock unlimited

5. 禁用swap

注释掉/etc/fstab里的swap行,并关闭swap:

1
swapoff -a

6. 重启机器

1
reboot

二、各节点基础软件安装与配置

因为GFW的存在,部分软件我们配置阿里云的安装源

1. 安装docker

安装见官方文档

安装依赖包

1
2
3
4
yum install -y epel-release
yum update -y
yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget ntpdate libseccomp libtool-ltdl
yum -y install docker-ce-17.03.2.ce

我们需要配置docker的默认目录和国内镜像源

1
vim /etc/docker/daemon.json

上面文件和目录,没有可以手动创建,配置如下:

1
2
3
4
5
6
{
"insecure-registries":["192.168.100.100"],
"registry-mirrors": ["192.168.100.100"],
"live-restore": true,
"log-opts":{"max-size" :"100m","max-file":"10"}
}

其中:192.168.100.100是指本地搭建好的harbor仓库,且kubernetes镜像已经在仓库内准备就绪

重新启动docker服务

1
2
systemctl enable docker
systemctl restart docker

2. 安装kubeadm,kubelet,kubectl

添加阿里云的kubernetes安装源

vim /etc/yum.repos.d/kubernetes.repo

1
2
3
4
5
6
7
[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

安装

1
2
yum -y install kubeadm kubelet kubectl ipvsadm
systemctl enable kubelet

三、master节点安装配置

1. 获取被墙的google镜像

kubeadm初始化会从google镜像站点gcr.io拉取需要的镜像,为了获取被GFW墙掉的镜像,可以翻墙拉取到本地,改成相同的镜像名;或将各yaml文件中的gcr.io替换为国内(如阿里云)或本地(如harbor)镜像源地址,或docker使用代理方式获取,方法如下

在/usr/lib/systemd/system/docker.service配置中[Service]添加如下列

  • http代理方式
1
Environment="ALL_PROXY=http://IP:PORT"
  • sockt代理方式
1
Environment="ALL_PROXY=socks5://IP:PORT"

重新加载并重启docker

1
2
systemctl daemon-reload
systemctl restart docker

此次实验我们已经创建好harbor本地镜像仓库,k8s镜像仓库地址为192.168.100.100/k8s

2. 初始化master节点

1
kubeadm init --apiserver-advertise-address=192.168.100.101 --image-repository=192.168.100.100/k8s --pod-network-cidr=10.42.0.0/16 --service-cidr=10.43.0.0/16 --kubernetes-version=v1.13.2

参数详解:

  • –apiserver-advertise-address apiserver监听地址
  • –image-repository 指定默认镜像仓库地址(默认是gcr.io),测试镜像均位于192.168.100.100/k8s树下
  • –pod-network-cidr pod网络的网段,请注意不要和k8s默认网段以及主机所有网段有冲突
  • –service-cidr service网络的网段
  • –kubernetes-version 指定kubernetes版本

请注意命令执行完后最下面的输出内容

1
2
3
4
5
6
7
8
9
10
11
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (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:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.100.101:6443 --token 5hagg1.8p1xtxtukam988lz --discovery-token-ca-cert-hash sha256:863923187d6a51bba146cfc9cbe2111b9223c11da10ca9e33e243b5f60dabb25

请记住kubeadmm join这一行,这即为node加入的完整命令

若忘记join token,可通过以下命令获取

1
kubeadm token create --print-join-command

集群启动后要获取集群的使用权限,上面提示了master节点需要配置环境变量(普通用户),若使用root用户连接和管理,我们需要在root家目录的.bash_profile文件中添加以下环境变量并使其生效:

1
2
3
export KUBECONFIG=/etc/kubernetes/admin.conf
cp -i /etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) HOME/.kube/config

可选:kubeadm init默认初始化生成单节点的etcd服务,为避免单点故障,可手动创建3节点的etcd集群;kubeadm init连接外部etcd集群的方式是使用–config参数外挂配置文件kubeadm-config.yaml,以下为示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
kubernetesVersion: v1.11.1
apiServerCertSANs:
- 192.168.10.14
networking:
serviceSubnet: 10.96.0.0/12
podSubnet: 10.128.0.0/16
api:
advertiseAddress: 192.168.10.14
etcd:
endpoints:
- https://192.168.10.14:2379
- https://192.168.10.15:2379
- https://192.168.10.16:2379
caFile: www.chaoyueyule.com /etc/etcd/ssl/etcd-ca.pem
certFile: www.feifanyule.cn /etc/etcd/ssl/etcd.pem
keyFile: www.thd178.com /etc/etcd/ssl/etcd-key.pem

3. 安装CNI网络插件

网络插件Calico用于管理k8s集群规划的pod网络,保证分配到每个Node上的容器的IP唯一和连通性,kubernetes可供选择的网络插件有很多,
如Calico,Canal,flannel,Kube-router,Romana,Weave Net,详见官方文档

yaml文件地址:

1
2
https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

需要修改image参数为本地Harbor镜像源

  • calico_rbac.yml
  • calico.yml

记得修改网络地址为自己定义好的地址

1
"Network": "10.42.0.0/16",
1
2
3
cd /tmp
kubectl create -f calico_rbac.yml
kubectl create -f calico.yml

可以通过以下命令查看状态

1
2
kubectl -n kube-system get pods
kubectl -n kube-system get rs

三、添加node节点

只需要在node节点上执行上面master节点初始化后的join命令即可加入到k8s集群

1
kubeadm join 192.168.100.101:6443 --token 5hagg1.8p1xtxtukam988lz --discovery-token-ca-cert-hash sha256:863923187d6a51bba146cfc9cbe2111b9223c11da10ca9e33e243b5f60dabb25

:添加master节点只需在上述命令后追加--experimental-control-plane参数即可

若添加成功,在master节点可以通过以下命令查看

1
2
3
4
5
[root@k8s-node1 tmp]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-node1 Ready master 7d2h v1.13.3
k8s-node2 Ready <none> 7d2h v1.13.3
k8s-node3 Ready <none> 7d2h v1.13.3

至此,集群创建完毕