kubernetes1.9.6墙内离线部署(附资源)

简介:

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

image.png

按照上面提示,此时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

显示如下表示正常:


image.png
  • 部署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上查看各节点状态:
image.png

从上图中看目前所有节点都是 NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在 Pod 中运行,

都需要先从google下载镜像,这里由于我们已经将需要的镜像导入到本地,所以可以正常运行这些pod。

若遇到过了一段时间还处于NotReady我们可以通过如下命令查看 Pod 的状态:

kubectl get pod --all-namespaces

image.png

对于存在问题的pod可以执行如下命令来查看具体的详细原因:

kubectl describe pod kube-flannel-ds-snfxj --namespace=kube-system

这里就不贴出来我的pod问题图片(因为我node节点忘记导入需要的镜像了............-_-!)

集群正常的健康状态是这样子滴:

image.png

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和上面的一样,需要自行修改。
image.png

访问:https://192.168.100.135:32666


image.png
  • kubernetes-dashboard的认证:
    dashboard的认证可以基于kubeconfig文件、口令、基本(用户名和密码)这三种方式的认证。根据官网说是可以支持basic的认证,但是我在这个版本下试了下没成功,所以这里我就使用了基于口令的方式来认证。

3.1、基于口令的方式部署:

## 我们先删除前面创建的dashboard:
kubectl delete -f kubernetes-dashboard.yaml

从官网下载的1.8.3的dashboard的yaml配置文件默认是开启basic的认证,没有基于口令
的方式,我们使用基于口令认证的方式前提需要将kubernetes-dashboard.yaml文件中
的basic这行注释掉。
如下图:


image.png

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=>选择口令=>输入上面的口令即可:

image.png

image.png

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会导致访问出错


basic.png

删除之前的dashboard然后在重新创建一个dashboard既可:


basic-login.png

参考:

https://kubernetes.io/docs/reference/access-authn-authz/authentication/#static-password-file

你可能感兴趣的:(kubernetes1.9.6墙内离线部署(附资源))