===============================================

2018/3/22_第2次修改                       ccb_warlock

更新说明:

2018/3/22:修改了6.7中k8s-dashboard中url错误的问题;

===============================================

为了让产品在迎来业务量爆发式增长前完成应对措施,在浏览无数的资料后,决定将服务逐渐进行容器化,最终能达到容器集群的效果。而容器集群的解决方案中,kubernetes(简称k8s)看起来是个可行的方案。我目前的理解是,k8s就是docker容器集群的一个管理系统,有很多实用功能能提高开发、运维的效率。

尝试过使用在线部署的方式,当时记得即使配了代理有些资源仍然拉不下来,纠结了一天最后查找到了离线部署的教程(https://segmentfault.com/a/1190000012755243),这篇教程基本可以部署出可用的k8s。

本篇的部署内容和这个教程大体相同,我只是根据我部署的过程增补了一些描述和图片、修改了原教程中一些存在问题的内容。

节点配置信息表
节点 主机名 IP OS CPU核数   内存大小   
Master     K8s-master        192.168.12.21        centos 7        4 4G
Node1  K8s-node-1 192.168.12.22 centos 7 4 4G
Node2  K8s-node-2 192.168.12.23 centos 7 4 4G

 一、基础设置

 1.1 安装vim

yum install -y vim

 1.2 设置主机名

Master上执行:

hostnamectl --static set-hostname  k8s-master

Node1上执行:

hostnamectl --static set-hostname  k8s-node-1

Node2上执行:

hostnamectl --static set-hostname  k8s-node-2

# 重启

reboot

 1.3 分别修改三个节点的hosts文件,并使内容保持一致

# 编辑hosts文件

vim /etc/hosts

# 新增下面的内容,wq保存。

192.168.12.21 k8s-master
192.168.12.22 k8s-node-1
192.168.12.23 k8s-node-2

 1.4 关闭防火墙

这里为了部署方便,我跟原教程一样直接关了防火墙。

systemctl stop firewalld
systemctl disable firewalld

 1.5 关闭selinux

为了允许容器访问主机文件系统,这是pod网络所需的。目前必须这样做,直到在kubelet中改进SELinux支持。

# 编辑config文件

vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,wq保存。

# 当前临时关闭selinux(不重启临时关闭selinux的方式)

setenforce 0

 1.6 关闭swap

试验下来k8s需要关闭虚拟内存。

# 当前临时关闭虚拟内存

swapoff -a

# 修改/etc/fstab文件

vim /etc/fstab

# 加#注释掉下面的语句屏蔽SWAP的自动挂载,wq保存

#/dev/mapper/centos-swap swapswapdefaults0 0

# 查看内存使用情况

free -m

 1.7 配置路由参数,防止kubeadm报路由警告

CentOS 7上的某些用户报告了由于iptables被绕过而导致流量被错误路由的问题。你应该确保net.bridge.bridge-nf-call-iptables在你的sysctl配置中设置为1。试验下来即使是firewalld的也要修改配置。

# 将内容写入k8s.conf文件

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 立即生效

sysctl --system

 1.8 获取离线包

离线包链接:https://pan.baidu.com/s/1eTWTXSI

密码:6uma

(教程里作者提供的文件中有个文件名和其教程的命令不一致,我修改该文件名后重新打包)

将k8s_images.tar.bz2上传到/root下。

# 安装 bzip2

yum install -y bzip2

# 解压k8s_images.tar.bz2

tar -xjvf k8s_images.tar.bz2

 二、部署docker

选择安装docker1.2,因为官方建议的版本。1.11、1.13和17.03版本也可以。17.06+版本可能有效,但未经过Kubernetes团队的测试。

 2.1 安装

yum install -y docker

 2.2 启动

systemctl start docker
systemctl enable docker

 2.3 查看版本

docker version

 2.4 设置镜像加速器

墙的缘故,访问docker hub不够稳定,故需要设置镜像加速器来解决这个问题。
这里我使用的是阿里云的镜像加速器。登录阿里云后,访问https://cr.console.aliyun.com/#/accelerator

ps:registry-mirrors的值必须带https:// (有段时间阿里云的教程中只有域名),否则会出现docker重启报错的情况。

 2.5 查看docker文件驱动

docker info

这里我们主要是看cgroup driver。因为K8S要求cgroup driver与docker的保持一致。yum方式部署的应该是1.12.6,其Cgroup Driver为systemd。


 三、分别在三个节点上部署kubeadm、kubelet、kubectl

 3.1 导入镜像 

docker load </root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load </root/k8s_images/kubernetes-dashboard_v1.8.1.tar

 3.2 安装

cd /root/k8s_images
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm kubelet-1.9.9-9.x86_64.rpm
rpm -ivh kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

 3.3 修改kubelet的配置文件

kubelet默认的cgroup-driver和docker的不一样,docker有的版本可能是cgroupfs,kubelet默认为systemd,如果不修改则会引起kubelet启动失败。

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 重新载入

systemctl daemon-reload

 3.4 启动

systemctl enable kubelet && systemctl start kubelet

ps:此时用systemctl status查看会发现服务没有完全起来,这是因为还缺少许多文件在K8S初始化补齐后才能完全运行,所以我们继续部署。


 四、部署master节点

 4.1 初始化k8s

kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

等待1分钟后,出现下面的内容。

如果长时间(等待的时间超过3分钟以上)始终停留在“[init] This might take a minute or longer if the control plane images have to be pulled.”,就要查看/var/log/message里的内容,是什么错误导致初始化失败。
排除错误后,先重置,再初始化。

# 初始化过程出现错误时,使用下面的命令重置
kubeadm reset
# 重置后再初始化
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

上图中的token信息要记得保留,等会node的加入需要使用。如果忘记了,可以在master上通过kubeadm token list得到。默认token在24小时后过期,后续的node要加入集群需要在master节点上用下面的命令重新生成token。

kubeadm token create

 4.2 配置环境变量

此时root用户还不能使用kubelet控制集群,还需要配置该环境变量。

# 将信息写入bash_profile文件

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 立即生效

source ~/.bash_profile

 4.3 查看版本

kubectl version

 4.4 安装flannel

离线包有yml文件,所以直接用。

# 创建flannel

kubectl create -f kube-flannel.yml


 五、部署node节点

# 使用4.1保存的“kubeadm join”的命令,分别将各个node节点加入master(token信息请根据你实际部署的修改掉,这里只是我部署时生成的内容)

kubeadm join --token 1ff84c.b7828d504656ba64 192.168.12.21:6443 --discovery-token-ca-cert-hash sha256:ceb2b93ce7543174b8fa87628fbe1f3926b5206915fee06629195ea8b4b89fe7 

根据提示,到master节点上检查下,在master上运行下面的命令。

kubectl get nodes

# kubernetes会在每个node节点创建flannel和kube-proxy的pod


 六、部署kubernetes-dashboard

虽然经过几天的学习常用的k8s命令已经能熟练使用了,但是有个页面能够显示信息总比自己一个个命令查询效率来的高,还好原教程的作者也将该页面的yaml文件保存在离线包里了。

由于k8s的工作负载都放在node节点上,所以等node部署完后才进行页面的部署。

 6.1 修改配置文件

# 编辑kubernetes-dashboard.yaml

cd /root/k8s_images
vim kubernetes-dashboard.yaml

# 添加type: NodePort,暴露Dashboard服务。注意这里只添加行type: NodePort即可,其他配置不用改。

(我这里需要补个截图)

 6.2 创建

kubectl create -f kubernetes-dashboard.yaml

 6.3 设置端口

由于系统默认的有效端口为30000-32767,故需要修改kube-apiserver.yaml设置我们需要的端口范围。

# 修改kube-apiserver.yaml

vim /etc/kubernetes/manifests/kube-apiserver.yaml

# 添加下面的内容,wq保存。

    - --service-node-port-range=1-65535

ps:-与--之间的不是空格

 6.4 设置验证方式

默认验证方式有kubeconfig和token,这里都不用,我们使用basicauth的方式进行apiserver的验证。

# 创建/etc/kubernetes/pki/basic_auth_file, 用于存放用户名、密码、用户ID。

cat <<EOF >  /etc/kubernetes/pki/basic_auth_file
admin,admin,2
EOF

# 编辑kube-apiserver.yaml,给kube-apiserver添加basic_auth验证

cd /etc/kubernetes/manifests
vim kube-apiserver.yaml

# 添加下面的内容,wq保存。

    - --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

ps:-与--之间的不是空格

 6.5 更新apiserver

改完kube-apiserver.yaml后如果直接更新kube-apiserver容器,有时会报“The connection to the server 192.168.12.21:6443 was refused - did you specify the right host or port?”,试验后发现在更新之前还需要重启kubelet。

# 重启kubelet

systemctl restart kubelet

# 更新kube-apiserver容器

cd /etc/kubernetes/manifests
kubectl apply -f kube-apiserver.yaml

 6.6 授权

k8s 1.6以后的版本都采用RBAC授权模型。

# 查看cluster-admin

kubectl get clusterrole/cluster-admin -o yaml

# 给admin授权。默认cluster-admin是拥有全部权限的,将admin和cluster-admin bind这样admin就有cluster-admin的权限。

kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

# 查看

kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml

 6.7 登录

由于https证书的问题,暂时只能先通过火狐浏览器增加安全例外的方式访问https://192.168.12.21:32666(端口是6.1中kubernetes-dashboard.yaml文件原作者配置的32666,如果需要修改请在6.1中进行修改后再创建)

6.4中,我配置的用户名/密码为admin/admin,故使用该用户名密码登录。


 参考资料:

1.https://segmentfault.com/a/1190000012755243

2.《kubernetes权威指南》

3.https://kubernetes.io/docs/setup/independent/install-kubeadm/

4.https://www.cnblogs.com/liuxuzzz/p/5324749.html

使用离线包部署kubernetes 1.9.0、kubernetes-dashboard 1.8的更多相关文章

  1. 二进制方式部署Kubernetes 1.6.0集群(开启TLS)

    本节内容: Kubernetes简介 环境信息 创建TLS加密通信的证书和密钥 下载和配置 kubectl(kubecontrol) 命令行工具 创建 kubeconfig 文件 创建高可用 etcd ...

  2. 关于Kubernetes v1.14.0的 kube-controller-manager部署

    1. kube-controller-manager准备 默认kube-controller-manager 部署在kube-apiserver部署的服务器上面服务器的配置等在这就不在列出来 二进制文 ...

  3. 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  4. Kubernetes 1.10.0离线安装

    讲述如何通过离线的方式安装Kubernetes,主要用于对Kubernetes的研究学习,不建议在生产环境使用,安装包获取地址: 链接:https://pan.baidu.com/s/1nX5_mem ...

  5. 使用 kubeadm 安装 kubernetes v1.16.0

    近日通过kubeadm 安装 kubernetes v1.16.0,踩过不少坑,现记录下安装过程. 安装环境: 系           统:CentOS Linux release 7.6 Docke ...

  6. 002.使用kubeadm安装kubernetes 1.17.0

    一 环境准备 1.1 环境说明 master      192.168.132.131      docker-server1 node1       192.168.132.132      doc ...

  7. 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)

    一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...

  8. 基于Kubernetes v1.24.0的集群搭建(二)

    上一篇文章主要是介绍了,每台虚拟机的环境配置.接下来我们开始有关K8S的相关部署. 另外补充一下上一篇文章中的K8S的change​log链接: https://github.com/kubernet ...

  9. Windows Server 2008 R2 IIS7.5 部署 MVC HTTP 404.0 Not Found 错误

    如图 在Windows Server 2008 R2 IIS7.5 部署 MVC HTTP 404.0 Not Found 错误,在Win7环境下测试正常,在百度中查找相关解决方法,如修改配置文件等, ...

  10. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

    今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...

随机推荐

  1. C#基础-代码部署数据库及IIS站点

    一.前言        最近忙里偷闲,做了一个部署数据库及IIS网站站点的WPF应用程序工具. 二.内容        此工具的目的是: 根据.sql文件在本机上部署数据库 在本机部署IIS站点,包括 ...

  2. 【POJ2411】Mondriaan's Dream(轮廓线DP)

    [POJ2411]Mondriaan's Dream(轮廓线DP) 题面 Vjudge 题解 这题我会大力状压!!! 时间复杂度大概是\(O(2^{2n}n^2)\),设\(f[i][S]\)表示当前 ...

  3. Java之高级IO,Properties

    IO流(高级) 释放资源的标准代码 主要考虑的是在什么时候释放资源比较合适.而且在jdk1.7之前和之后是不同的. package com.wzlove.demo; import java.io.Fi ...

  4. Compile、Make和Build的区别(as make, build, clean, run)

    Compile.Make和Build的区别 - 熔 岩 - 51CTO技术博客 http://lavasoft.blog.51cto.com/62575/436216/ 针对Java的开发工具,一般都 ...

  5. as, idea 出现 Gradle's dependency cache may be corrupt 错误分析

    问题: Error:Failed to open zip file.Gradle's dependency cache may be corrupt (this sometimes occurs af ...

  6. 解题:TJOI 2015 弦论

    题面 好像是个经典问题,然而我没做过 建SAM,然后经过每个节点的子串数目就可以求了,多个相同子串算一个的话就把所有siz都搞成$1$,否则就是$right$集合的大小,然后就是常见的递推 求第$k$ ...

  7. (转)java getResourceAsStream的使用方法

    背景:对于java项目中配置文件加载时候的绝对路径和相对路径做一个清晰的认识! 1 分析路径 在Java项目中会经常用到getResourceAsStream这个函数获取一些配置文件,但是怎样正确使用 ...

  8. PPTP协议握手流程分析--转载

    一  PPTP概述   PPTP(Point to Point Tunneling Protocol),即点对点隧道协议.该协议是在PPP协议的基础上开发的一种新的增强型安全协议,支持多协议虚拟专用网 ...

  9. 【题解】Tree-String Problem Codeforces 291E AC自动机

    Prelude 传送到Codeforces:(/ω\)--- (/ω•\) Solution 很水的一道题. 对查询的串建出来AC自动机,然后树上随便跑跑就行了. 为什么要写这篇题解呢? 我第一眼看到 ...

  10. Ansible11:变量详解

    目录 简单说明 一.在Inventory中定义变量 二.在Playbook中定义变量 1.通过vars关键字定义 2.通过vars_files关键字引入变量文件 3.通过vars_prompt来实现人 ...