简介:
k8s新的版本与之前1.5的部署方式发生改变,官方将kubernetes大组件中的服务例如(kube-proxy、kube-api等服务)剥离出来封装成容器的形式来简化部署的方式。以下为三个必装的服务:
kubelet #----运行在 Cluster 所有节点上,主要负责启动 Pod 和容器。新版的的k8s默认将cadvisor集成到kubelet中了,我们只需要开放相应的端口(4194)即可。
kubeadm #--用于初始化和引导Cluster(是官方推出快速部署k8s集群,其本质是将k8s的相关服务容器化)
kubectl #----是 Kubernetes 命令行工具与api交互。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
1. 部署环境:
centos7.3、docker-ce-17-03.0、kubelet-1.9.6-0、kubeadm-1.9.6-0、kubectl-1.9.6-0
ka8-master:192.168.100.135
k8s-node:192.168.100.134
注意:两台机器的时间一定要一致,并且docker-ce的版本不能大于17.03,docker可以使用官方的源进行安装,安装的时候指定需要安装的版本,或者使用rpm包安装即可。
k8s需要用到的镜像已经打包好上传到云盘:
链接: https://pan.baidu.com/s/1CVuCwX3Fl-VcUxftXPEN1g 密码: 56a3
2. 安装部署:
1)、前期环境配置:
按照官方的方式安装会失败因为使用k8s源在Google上,这里我们可以使用阿里云的源来进行yum安装必要的三个组件。
- Master和Node上操作如下:
##关闭防火墙:
$systemctl stop firewalld
$systemctl disable firewalld
##关闭swap:
$swapoff -a
$sed -i 's/.*swap.*/#&/' /etc/fstab
##关闭selinux:
$setenforce 0
##添加kubernetes源
$cat:
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
## 安装iptables
$ yum install iptables-services -y
## 将/etc/sysconfig/iptables规则改成如下:
# Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Fri Apr 13 17:36:35 2018
# Generated by iptables-save v1.4.21 on Fri Apr 13 17:36:35 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 1:65535 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1:65535 -j ACCEPT
COMMIT
## 启用iptables
$ systemctl start iptables && iptables -P FORWARD ACCEPT &&systemctl enable iptables
注意:这里这样操作是为了不让iptables拦截我们需要开放的端口,以及将FORWARD表设置为默认转发,
用于跨主机pod之间的通信。
2)、Master和Node上安装docker-ce并导入镜像:
##安装docker-ce:
$rpm -ihv docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
$rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
##启动docker-ce
$systemctl start docker
$systemctl enable docker
##解压下载的镜像包:
$tar -jvxf k8s-1.9.6-images.tar.bz2
$cd k8s-1.9.6-images
##导入所需要的镜像包:
$docker load
为了加快(toulan)导入镜像的效率,写了一个简单的脚本来一键导入,需要在上文解压的镜像包目录(k8s-1.9.6-images)下创建脚本并且执行,例如在master上执行/root/k8s-1.9.6-images/dockerload-images.sh选择1即可。
#!/bin/bash
declare serial
PS3="Enter a Number:"
serial=(1 2)
script_path=$(cd $(dirname $0) && pwd)
select var in "master" "node"
do
if ! echo ${serial[@]} | grep -q $REPLY;then
echo "Error Number,Please Enter[1-2]"
continue
fi
case $var in
master)
echo "this is master"
docker load < ${script_path}/etcd-amd64_3.1.11.tar
docker load < ${script_path}/flannel_v0.10.0-amd64.tar
docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
docker load < ${script_path}/kube-controller-manager-amd64_v1.9.6.tar
docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
docker load < ${script_path}/kube-scheduler-amd64_v1.9.6.tar
docker load < ${script_path}/pause-amd64_3.0.tar
break
;;
node)
docker load < ${script_path}/etcd-amd64_3.1.11.tar
docker load < ${script_path}/flannel_v0.10.0-amd64.tar
docker load < ${script_path}/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load < ${script_path}/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load < ${script_path}/k8s-dns-sidecar-amd64_1.14.7.tar
docker load < ${script_path}/kube-apiserver-amd64_v1.9.6.tar
docker load < ${script_path}/kube-proxy-amd64_v1.9.6.tar
docker load < ${script_path}/kubernetes-dashboard-amd64_v1.8.3.tar
docker load < ${script_path}/pause-amd64_3.0.tar
break
;;
*)
break
;;
esac
done
3)、Master和Node节点安装k8s:
- Master和Node节点修改参数
##修改内核两个参数(这两个是参数是防止应用部署在centos系统情况下由于iptables被绕过而导致的路由错误)
简单的说就是使流过网桥的流量也进入iptables/netfilter框架中:
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$sysctl --system
##yum安装必要的三个组件:
yum install -y kubelet-1.9.6-0 kubectl-1.9.6-0 kubeadm-1.9.6-0
##确保kubelets使用的cgroup-driver和docker使用的cgroup-driver一样:
$sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
##开启k8s默认的cAdvisor服务,开放kubelet 4194端口:
编辑:vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 修改如下:
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=4194"
##启动kubelet服务:
$systemctl daemon-reload
$systemctl start kubelet
$systemctl enable kubelet
4)、集群初始化:
- master上执行如下进行初始化:
$kubeadm init --apiserver-advertise-address 192.168.100.135 --pod-network-cidr=10.244.0.0/16 --kubernetes-version 1.9.6
--apiserver-advertise-address #--指明用Master的哪个interface与Cluster 的其他节点通信
--pod-network-cidr #---指定Pod网络的范围k8s支持多种网络方案不同的网络方案对这个配置有不同的要求,这里设置为 10.244.0.0/16是因为我们将使用flanne 网络方案,所以设置成这个 CIDR。
--kubernetes-version #--指定k8s版本
## 要是初始化失败的话执行如下命令后再重新开始初始化
$ kubeadm reset
按照上面提示,此时root用户还不能使用kubelet控制集群,需要配置下环境变量:
##对于非root用户:
$mkdir -p $HOME/.kube
$cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$chown $(id -u):$(id -g) $HOME/.kube/config
##对于root用户:
$echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
$source ~/.bash_profile
##测试下:
$kubectl version
显示如下表示正常:
- 部署pod网络:
#Master上执行:
$kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- Node节点上执行如下加入:
#node节点注册加入:
$kubeadm join --token 0428e2.35a3db294493bfdb 192.168.100.135:6443 --discovery-token-ca-cert-hash sha256:d598c1b5229bc1e3b118bed424a5f369cbbb61c03072dcd126f209ca7b5efbba
##这里的token为我们在maste初始化时候给出的token,若是忘记或者关闭了master窗口没记录下来可以在master上执行如下来获取token加入:
$kubeadm token list
- Master上查看各节点状态:
从上图中看目前所有节点都是 NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,
都需要先从google下载镜像,这里由于我们已经将需要的镜像导入到本地,所以可以正常运行这些pod。
若遇到过了一段时间还处于NotReady我们可以通过如下命令查看 Pod 的状态:
kubectl get pod --all-namespaces
对于存在问题的pod可以执行如下命令来查看具体的详细原因:
kubectl describe pod kube-flannel-ds-snfxj --namespace=kube-system
这里就不贴出来我的pod问题图片(因为我node节点忘记导入需要的镜像了............-_-!)
集群正常的健康状态是这样子滴:
3.kubernetes-dashboard部署:
- Master上执行如下:
#给master主机设置一个label用来后面部署dashborad的时候指定部署到master主机上,防止部署到node节点上
$kubectl label nodes k8s-master master=node1
#用于部署kubernetes-dashboard的yaml文件也在刚刚下载的压缩包里面,所以一样进入k8s-1.9.6-images目录
$kubectl create -f kubernetes-dashboard.yaml
注意:设置label是因为我修改了kubernetes-dashboard.yaml,防止部署到node节点上去,到时候还得修改其他配置,麻烦
(-_-),压缩包中的该配置文件我已经改成如下,若不想设置label和上面的一样,需要自行修改。
访问:https://192.168.100.135:32666
- kubernetes-dashboard的认证:
dashboard的认证可以基于kubeconfig文件、口令、基本(用户名和密码)这三种方式的认证。根据官网说是可以支持basic的认证,但是我在这个版本下试了下没成功,所以这里我就使用了基于口令的方式来认证。
3.1、基于口令的方式部署:
## 我们先删除前面创建的dashboard:
kubectl delete -f kubernetes-dashboard.yaml
从官网下载的1.8.3的dashboard的yaml配置文件默认是开启basic的认证,没有基于口令
的方式,我们使用基于口令认证的方式前提需要将kubernetes-dashboard.yaml文件中
的basic这行注释掉。
如下图:
1)、## 这里创建一个dashboard的资源:
$ kubectl create -f kubernetes-dashboard.yaml
2)、## 创建一个基于RBAC认证的角色绑定资源:
$ vim Dashboard-ServiceAccount-ClusterRoleBind.yaml
添加如下内容:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
## 创建该资源
$ kubectl create -f Dashboard-ServiceAccount-ClusterRoleBind.yaml
3)、 ## 获取上面创建的用户(admin-user)的Token
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
4)、## 打开https://ip:32666=>选择口令=>输入上面的口令即可:
3.2、基于账户信息的方式部署:
1)、## 创建静态密码文件,密码文件格式为csv格式:
$ vim /etc/kubernetes/pki/basic_auth_file
admin,admin,2004
注意:格式为 密码,账户,id
这里将静态文件放在/etc/kubernetes/pki/目录下的原因是,apiserver通过容器启动,这个路径已经挂载容器中了,可以被访问到。放在其他路径需要额外配置挂载路径。apiserver只会启动在master节点上,故仅需要在master节点上配置即可。
2)、###开启api server的basic认证:
$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
添加如下一行参数配置
- --basic-auth-file=/etc/kubernetes/pki/basic_auth_file
注意1:
在修改完apiserver后执行相关的命令kubectl get node,多半是执行不成功的,因为修改apiserver配置文件后,apiserver自动重启,然后启动失败,所以就无法访问集群了。这里我们可以手动来重启apiserver的容器,使用docker命令来重启apiserver的容器,最后在将kubelet服务重启下既可。
注意2:
要是修改了账户的密码后不重启apiserver新修改的密码将不会生效。
3)、###创建账户映射:
这里是为了进行权限的授权,这里暂时不多讲,后期会对认证机制进行详细的讲解。
$ vim basic-auth-admin-clusterrolebinding.yaml
添加如下内容:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: ClusterRoleBinding-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: User
name: admin
apiGroup: rbac.authorization.k8s.io
$ kubectl create -f basic-auth-admin-clusterrolebinding.yaml
4)、###修改dashboard认证配置:
开启dashboard的两个验证,若只开一个basic会导致访问出错
删除之前的dashboard然后在重新创建一个dashboard既可:
参考:
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-password-file