Kubeadm安装kubernetes
现在使用kubeadm安装kubernetes已经非常方便,极大的提高了部署效率,以下为测试验证过程。
软件版本:
组件名 | 版本 | 说明 |
---|---|---|
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 |
以三个主机为例,详细角色信息如下:
主机名 | 角色 | 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 |
k8s-node4 | worker | 192.168.100.104 | CentOS7.3_x64 | kubeadm,kubelet,kubectl,docker | calico,proxy |
§一、各节点初始化
§1. 关闭防火墙
1 | systemctl stop firewalld.service |
注:若要开启防火墙,在放行kubernetes集群及服务所有端口以外,还需要配置防火墙的FORWARD链接默认ACCEPT
§2. 永久关闭SELinux
1 | setenforce 0 # 不重启的情况下 |
§3. 同步集群系统时间
1 | yum -y install ntp |
§4. 设置内核参数及加载ipvs模块
因安装网络插件,需要系统开启以下参数
vim /etc/sysctl.conf
1 | net.ipv4.ip_forward=1 |
若要启用ipvsadm,必须要加载以下内核模块
1 | modprobe br_netfilter |
vim /etc/security/limits.conf
1 | * soft nofile 65536 |
§5. 禁用swap
注释掉/etc/fstab里的swap行,并关闭swap:
1 | swapoff -a |
§6. 重启机器
1 | reboot |
§二、各节点基础软件安装与配置
因为GFW的存在,部分软件我们配置阿里云的安装源
§1. 安装docker
安装见官方文档
安装依赖包
1 | yum install -y epel-release |
我们需要配置docker的默认目录和国内镜像源
1 | vim /etc/docker/daemon.json |
上面文件和目录,没有可以手动创建,配置如下:
1 | { |
其中:192.168.100.100是指本地搭建好的harbor仓库,且kubernetes镜像已经在仓库内准备就绪
重新启动docker服务
1 | systemctl enable docker |
§2. 安装kubeadm,kubelet,kubectl
添加阿里云的kubernetes安装源
vim /etc/yum.repos.d/kubernetes.repo
1 | [kubernetes] |
安装
1 | yum -y install kubeadm kubelet kubectl ipvsadm |
§三、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 | systemctl daemon-reload |
此次实验我们已经创建好harbor本地镜像仓库
§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 | Your Kubernetes master has initialized successfully! |
请记住kubeadmm join这一行,这即为node加入的完整命令
若忘记join token,可通过以下命令获取
1 | kubeadm token create --print-join-command |
集群启动后要获取集群的使用权限,上面提示了master节点需要配置环境变量(普通用户),若使用root用户连接和管理,我们需要在root家目录的.bash_profile文件中添加以下环境变量并使其生效:
1 | export KUBECONFIG=/etc/kubernetes/admin.conf |
可选:kubeadm init默认初始化生成单节点的etcd服务,为避免单点故障,可手动创建3节点的etcd集群;kubeadm init连接外部etcd集群的方式是使用–config参数外挂配置文件kubeadm-config.yaml,以下为示例:
1 |
|
§3. 安装CNI网络插件
网络插件Calico用于管理k8s集群规划的pod网络,保证分配到每个Node上的容器的IP唯一和连通性,kubernetes可供选择的网络插件有很多,
如Calico,Canal,flannel,Kube-router,Romana,Weave Net,详见官方文档
yaml文件地址:
1 | https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml |
需要修改image参数为本地Harbor镜像源
- calico_rbac.yml
- calico.yml
记得修改网络地址为自己定义好的地址
1 | "Network": "10.42.0.0/16", |
1 | cd /tmp |
可以通过以下命令查看状态
1 | kubectl -n kube-system get pods |
§三、添加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 | [root@k8s-node1 tmp]# kubectl get nodes |
到此,集群创建完毕
§四、添加heapster监控插件
在master节点操作
参考:下载yaml文件到heapster目录,yaml文件地址:
1 | https://github.com/kubernetes/heapster/blob/master/deploy/kube-config/influxdb/influxdb.yaml |
同样需要修改image参数为本地Harbor镜像源
- k8s_heapster.yaml
启动
1 | cd /tmp |
默认的,kubernetes的master节点不会参与任务调度,可通过kubectl describe node node_name来查看
1 | [root@k8s-node1 manifests]# kubectl describe k8s-node1 |
通过以下配置来取消些限制
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |
成功后稍等一段时间,即可用kubectl top nodes/pods命令了
1 | [root@k8s-node1 manifests]# kubectl top nodes |
§五、创建ingress反向代理及内部负载均衡器插件
记得修改image的本地仓库源,ingress对应yaml文件请至官方下载
- k8s_ingress-nginx.yaml
创建ingress
1 | cd /tmp |
注:ingress插件需要匹配到selector有"type=lb"才会运行
1 | [root@k8s-node1 ~]# kubectl get ds --all-namespaces |
设置节点标签
1 | [root@k8s-node1 ~]# kubectl label node k8s-node3 type=lb |
且已定义了如下几个服务的访问端口(通过ingress节点才能访问到)
- dashboard: 59090
- prometheus-operated: 49090
§六、添加Dashboard(WebUI)
在master节点操作
§1. 下载官方yaml文件
yaml文件地址:
1 | cd /tmp |
§2. 同样需要修改image参数为本地Harbor镜像源
- k8s_dashboard.yml
§3. 启动dashboard
- 启动dashboard
1 | cd /tmp |
§4. 登陆dashboard
- 方式一:因ingress已配置好dashboard,所以只需要访问ingress节点的59090端口即可
http://k8s-node3:59090
Kubernetes支持多种验证方式
我们使用token方式来登陆,只需要在master节点去获取admin角色的token信息并用此token登入即可(token有效时间见上面kubernetes-dashboard.yaml配置)
获取登陆token
1 | kubectl -n kube-system get secret $(kubectl -n kube-system get secret |grep ^kubernetes-dashboard-token- |awk '{print $1}') -o jsonpath={.data.token}| base64 -d |
使用token登陆即可
- 方式二:若未配置,也可通过kube proxy来代理,如下:
首先需要在master节点为api创建proxy
1 | kubectl proxy --address='192.168.100.101' --port=9443 --accept-hosts='^$' --disable-filter=true |
合登陆URL为:http://192.168.100.101:9443/api/v1/namespaces/kube-system/services/kubernetes-dashboard:/proxy/#!/login