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 <<EOF > /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 <etcd-amd64_3.1.11.tar
$docker load < flannel_v0.10.0-amd64.tar
$docker load < k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
$docker load < k8s-dns-kube-dns-amd64_1.14.7.tar
$docker load < k8s-dns-sidecar-amd64_1.14.7.tar
$docker load < kube-apiserver-amd64_v1.9.6.tar
$docker load < kube-controller-manager-amd64_v1.9.6.tar
$docker load < kube-proxy-amd64_v1.9.6.tar
$docker load < kubernetes-dashboard-amd64_v1.8.3.tar
$docker load < kube-scheduler-amd64_v1.9.6.tar
$docker load < pause-amd64_3.0.tar

为了加快(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 <<EOF >  /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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 安装k8s Master高可用集群 主机 角色 组件 172.18.6.101 K8S Master Kubele...
    jony456123阅读 8,039评论 0 9
  • 版权声明:原创作品,谢绝转载!否则将追究法律责任。 前言 最近中国和印度的局势也是愈演愈烈。作为一个爱国青年我有些...
    李伟铭MIng阅读 2,043评论 0 5
  • Kubernetes部属说明 环境准备 资料准备 开始部属 编写yaml文件,用于部属Kubenetes基础容器e...
    俊逸之光阅读 2,599评论 2 0
  • docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(...
    Harvey_L阅读 19,877评论 3 44
  • 每次打开手机,想找一本好书,好的电影,好的学习软件,但是打开这个,关掉那个把时间都耗费在找的时间上了,问题是最后也...
    道路曲折而挑战阅读 236评论 0 0