Kubernetes(K8S)入门与安装配置

什么是K8S

Kubernetes 是一个跨主机集群的开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。谷歌旗下开源软件,江湖人称K8S。

K8S能做什么

  • 自动化容器部署和复制
  • 随时扩展和收缩容器规模
  • 容器分组Group,并且提供容器间的负载均衡
  • 实时监控,及时故障发现,自动替换
    只需要通过脚本规划好容器在哪台服务器运行、运行多少副本,K8S都能自动创建部署,K8S还支持自动或者手动的调节容器规模,例如数据库压力大时,动态增加数据的计算单元,服务器压力小时动态缩减tomcat的数量。K8S还支持容器间的负载均衡,通常在项目中做集群部署,大多使用Nginx做前置服务器分发请求,但是现在完全可以交给K8S去做负载均衡,因为K8S提供了容器间的负载均衡。K8S还支持实时监控,自动处理故障,当某个应用服务挂掉时,K8S会剔除掉对应服务并尝试自动重启服务。

K8S的几个关键概念

  • pod
  • container(容器)
  • Label(标签)
  • Replication Controller(复制控制器)
  • service(服务)
  • Node(节点)
  • Kubernetes Master(K8S主节点)
k8s架构图

上图是一个通过K8S搭建的集群环境,采用三台物理机搭建(三台机器是K8S搭建集群的最低要求),我先简单介绍一下几个重点名词。

  1. Kubernetes Master 是K8S的主服务器,容器的部署、发布、复制都是通过它发起的命令,一般是部署在单独的物理机上。同时所有外界的数据包也都是先经过Kubernetes Master,由它来进行分配。

  2. Node 是集群的节点,它可以是一个独立的物理机,也可以是一个虚拟机,在每个节点中都有一个以上的pod。Node里面的功能都是通过docker、kubelet、kube-proxy这三个应用程序实现。

    • docker,K8S容器编排技术就是dokcer容器实现的,必备组件。
    • kubelet是用来处理master 下发的任务, 管理pod 中的容器, 注册自身所在的节点,以系统服务的方式呈现。
    • kube-proxy用于实现K8S跨主机跨容器的网路通信,之前我们提到的Pod与Pod之间、容器与容器之间(Pause)的通信都是通过它来实现。
  1. pod是K8S独有的概念,也是最基础最重要的概念。 中文释义有豆荚,豌豆的意思。它是K8S里面最小的控制单元,相比docker中容器是最小的控制单元,他们之间又有什么联系与区别呢?
    • Pod是“容器”的容器,可以包含多个”Container”,这就是与docker容器的区别,Pod就像一个豌豆荚包含了多个豆子,他包含了多个容器

    • Pod是K8S最小可部署单元,一个Pod就是一个进程,拥有自己独立的资源

    • Pod都是部署完整的应用或模块,一般情况下一个Pod中应该是一整套完整的服务,或者一整套功能性的模块

    • Pod内部容器网络互通的(通过Pause实现),每个Pod都有独立虚拟IP,Pod与Pod之间的通信通过Service服务实现,所有的通信底层都是基于kube-proxy的。

      1. Pause是Pod的组成部分之一,Pause的一个作用是让同一个Pod的容器间可以直接使用localhost加端口号的形式互相访问
      2. Pause还提供同一个Pod内所有容器的公共数据卷挂载功能
pod内部组成图
  1. Label 标签可以理解为每一个Pod的别名
  2. Replication Controller 复制控制器的职责是对Pod数量进行监控,例如我们命令中需要三个Pod,但是现在只有两个,那么Replication Controller会自动创建一个新的Pod,当它发现某个Pod没有响应时,Replication Controller会自动剔除这个Pod,如果有必要会创建新的Pod。它让我们可以通过一个参数直接修改Pod的数量。

K8S安装教程

环境准备

Centos 7 Master * 1 (注意必须是双核以上的CPU,否则无法初始化K8S)

  • 192.168.220.131

Centos 7 Node * 2

  • 192.168.220.132
  • 192.168.220.133
  1. 设置主机名与时区
timedatectl set-timezone Asia/Shanghai 
hostnamectl set-hostname master   #131执行
hostnamectl set-hostname node1    #132执行
hostnamectl set-hostname node2    #133执行
  1. 为了便于区分,三台机器均配置以下hosts
vim  /etc/hosts
192.168.220.131 master
192.168.220.132 node1
192.168.220.133 node2
  1. 关闭Linux自带的安全增强模块,设置临时生效,并且关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld

K8S安装前置环境配置(三台机器都要执行)

  1. 将镜像包上传至服务器每个节点,里面包含了K8S、docker、以及各类配置文件,后面会有概述各个文件的作用。
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install

将文件上传至该目录
网盘地址:https://pan.baidu.com/s/1NiAdf0Gp24qjVx2v_HqqyQ
提取码:aew7

  1. 每个Centos上安装Docker,注意不要使用19.0以上的docker版本,目前最新的1.15版本K8S也暂时不支持19.0的版本
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf docker-ce-18.09.tar.gz
cd docker 
yum localinstall -y *.rpm   #加载当前目录下的所有rpm文件自动完成安装
systemctl start docker
systemctl enable docker
  1. 确保cgroup driver都是 groupfs
  • cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
  • cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
  • 子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。
  • 在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源
    虽然在现在版本的K8S会提示使用Linux自带的“Systemd”做为cgroup driver,但Systemd与cgroupfs作用相同,只不过cgroupfs是docker自带的,而systemd是linux系统自带的。早期k8s并没有建议使用Systemd,所以一直沿用到1.14。除非是极端情况下,默认使用docker自带的cgroupfs即可。

执行以下命令

docker info | grep cgroup 

如果不是groupfs,执行下列语句

cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker\
  1. 安装kubeadm,kubeadm是集群部署管理工具,可用来安装K8S的一个工具,极大简化安装流程
cd /usr/local/k8s-install/kubernetes-1.14
tar -zxvf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
  1. 关闭交换区,Linux的交换区类似windows系统中虚拟内存,不太建议使用这个选项,关闭掉
swapoff -a
vi /etc/fstab 

将最后一行注释

image.png
  1. 配置网桥,iptables是Linux的一个网络规则,对我们的包按规则进行过滤。该配置让K8S容器间通过网桥通讯的时候也要遵循iptables的规则,提高网络传输安全性
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. 加载k8s的docker镜像
cd /usr/local/k8s-install/kubernetes-1.14

docker load -i k8s-114-images.tar.gz  #加载K8S镜像
docker load -i flannel-dashboard.tar.gz  #集群可视化管理组件

运行docker images可以看到以下几个关键应用

image.png

kube-proxy 容器间通讯代理、kube-apiserver API服务端、kube-scheduler 任务调度器、kube-controller-manager 集群控制器、coredns K8S内置的 DNS 服务器、etcd 用于保存集群所有的网络配置和对象的状态信息、pause前面已经提到用于容器间的通讯以及数据卷的挂载。至此K8S安装完成

K8S集群安装配置

  1. master主服务器配置,kubernetes-version表示安装K8S的版本,pod-network-cidr设置pod的虚拟IP范围
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16

图中的第一个红框的命令是需要管理员手动复制,然后在master服务器上执行的。

  mkdir -p $HOME/.kube    #创建.kube目录
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config    #拷贝admin.conf文件到刚刚创建的目录
  sudo chown $(id -u):$(id -g) $HOME/.kube/config    #进行相应的授权

PS: admin.conf是kubeadm集群管理的核心配置文件,包含整个集群各个节点的授权信息,以及本身的一些配置信息

第二个红框中的命令是在node节点上执行,里面包含了一个加入集群的token认证信息以及ca证书的hashcode。通过该token可以加入K8S集群.

  1. 执行 kubectl get nodes 查看当前集群的所有节点

从图中看到master节点处于NotReady状态,说明节点中存在有问题的Pod,查看存在问题的pod,执行以下命令查看所有Pod状态

kubectl get pod --all-namespaces

如果某个Pod的STATUS处于CrashLoopBackOff状态表示创建失败了,那么它会不断自动重新创建。上图中两个coredns处于pending状态,原因是我们没有配置K8S网络通讯协议fannel,从上传的文件中加载并创建flannel网络组件

kubectl create -f kube-flannel.yml

3.在node节点上执行刚刚由kubeadm生成的节点加入命令

kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5 \
    --discovery-token-ca-cert-hash sha256:ef7751d4347df3a8b401c53588c8ee8376cb100c7f14c550c2d175a266b8b6a9 

如果出现反复无法加入节点的情况,运行 kubeadm reset 这条命令还原当前节点上 kubeadm init 或者 kubeadm join 所做的所有更改。当想加入新节点忘记token时可以使用 kubeadm token list 查看token,或者 kubeadm token create创建token,采用跳过ca安全认证的方式加入节点。

kubeadm join 192.168.220.131:6443 --token 25x9dp.3k4ysps4xeuv7lm5  --discovery-token-unsafe-skip-ca-verification

4.三台机器设置kubelet开机自启,至此通过kubeadm集群配置完成

systemctl enable kubelet

安装K8S可视化仪表盘

在主节点上执行以下命令,以下三个配件都是已经配置好的,装载即可。

kubectl apply -f kubernetes-dashboard.yaml  # web-ui 配置文件
kubectl apply -f admin-role.yaml  # 角色配置
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml #角色的权限配置
kubectl -n kube-system get svc  #获取系统命名空间下的所有服务

图中dashboard服务已经被创建,配置文件中关闭了密码验证,只需要浏览器打开 http://192.168.220.131:32000无需登录。

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

推荐阅读更多精彩内容