Advertisement

第一章 Kubernetes基础笔记

阅读量:

一、Kubernetes概述

1、背景

全称Kubernetes(简称K8S)源自Google基于Blog项目的改进版本,并于开源社区发布。随着 container技术 的快速普及发展,在过去几年里许多服务都无法直接部署于Linux主机或各大云服务提供商的虚拟机环境中;如今通过Docker技术将每个服务制作成镜像文件并运行于独立的Container实例中。

虽然其优势极为丰富,并非如想象中那般完美无缺

k8s是一款帮助我们实现对容器的管理平台,在多台服务器组成的分布式环境中运行Container。

2、基础概念

2.1、Master

Cluster的大脑,主要职责是调度,可以运行多个master来保证高可用。

2.2、Node

主要负责运行容器应用的 Node 节点由 Master 管理员进行操作,并实时监控并收集状态数据以供汇报。此外,在需要时 Master 还会协助处理与容器生命周期相关的事务。

2.3、Pod

1)PodK8s的最小工作单元,每个Pod包含一个或多个容器。

  • ·某些容器由于其特殊性通常都需要紧密联系以协同工作。在Kubernetes体系中.Pod作为一种更高级别的抽象机制,在设计上超越了传统的容器概念,并提供了一种更为灵活和统一的组织方式。
    • ·在Pod框架下.所有部署在同一namespace下的容器都会使用相同的IP地址和Port空间.这种设计使得不同Container之间可以通过localhost地址实现直接通信。
    • ·此外.这些Container不仅可以在网络层面上共享资源.在存储层面同样实现了高度协同.当Kubernetes系统将Volume挂载至一个Pod时.并不会仅限于该 Pod 内部的一个 Container;相反地.在实际操作中,默认情况下会将该 Volume 分配到所有同属同一Namespace下的所有 Pod 中的所有 Container。

2)Pod 控制器

K8s一般不会直接生成Pod资源,而是由Controller进行配置管理。在Controller中设置 pod 的部署参数,例如多个副本拷贝以及运行位置等设置。

K8s系统中包含多种Controller类型, 具体包括NodePod、ReplicaCluster、DaemonSet、StatefulCluster以及Job实例等.

  • ·ReplicationController:维持系统中Pod数量恒定的作用,并支持复制实例的滚动更新功能。
  • ·ReplicaSet:一种用于管理一组复制实例的数据结构,在此框架下不直接由用户进行操作。
  • ·ReplicaSet由一个声明式控制器(Deployment)负责管理其状态更新过程。
  • ·StatefulSet被采用于具有持久性服务的状态管理场景。
  • ·DaemonSet主要用于确保每个Node上只有一个复制实例的情况。
  • ·Job用于处理那些无需持续运行的操作任务,在Pod执行过程中发生故障时该类型控制器会自动重启相关Pod资源。
  • ·Cronjob则专门用于执行定期性的任务操作。

2.4、Service

当部署多个副本时会自动分配给每个Pod独立的副接口IP地址。外界如何获取这些副本的入口地址?由于Pod会被定期创建、销毁、重启,在动态网络环境中会导致其IP地址实时变化的问题无法直接通过IP地址访问。解决方案是Kubernetes服务机制。该服务负责管理一组特定的Pod资源,并提供统一入口供外部系统调用.

2.5、Namespace:

Namespace负责将实体的物理集群从逻辑上划分为多个虚拟集群,并且每个虚拟集群都相当于一个独立的Namespace空间。同一个Namespace内的资源可以实现共享使用而不产生冲突

Namespace负责将实体的物理集群从逻辑上划分为多个虚拟集群,并且每个虚拟集群都相当于一个独立的Namespace空间。同一个Namespace内的资源可以实现共享使用而不产生冲突

  • ·default:默认分配的namespace
  • ·kube-system: 自行管理的系统资源归入该namespace

******2.6、**Cluster

Cluster由计算、存储和网络资源的汇总组成,在Kubernetes的帮助下,这些资源被有效地管理以支持各种基于容器的应用。

******2.7、**Node

作业节点的主要职责是执行容器应用的部署与维护工作。作业节点(Node)由主节点(Master)进行统一调度与管理,并根据主节点的要求处理容器的生命周期管理。作业节点运行于基于Linux的操作系统环境中,并且可以在物理服务器或虚拟服务器之间灵活部署以满足不同的业务需求。

3、K8S的架构

The Kubernetes cluster comprises node-level Kubelet agents and master components (such as APIs, schedulers, and other services), and the architecture diagram of Kubernetes services follows.

该Master节点由API Server、Scheduler调度器以及ControllerManager控制器管理器等关键组件构成

Node节点包含的核心组件有Kubelet、Docker容器引擎、Kube-proxy

3.1、API Server(kube-apiserver)

包含HTTP/HTTPS和RESTful API的集合被称为Kubernetes API。API服务器充当Kubernetes集群的前端接口。各种客户端工具(如CLI工具或用户界面)以及K8S内部组件均可利用该服务管理集群资源。

3.2、Scheduler**(kube-scheduler)******

负责管理Pod部署的系统主要负责将Pod部署至特定Node。在调度过程中综合考量Cluster拓扑结构、各节点的工作负载状况以及应用对高可用性、性能指标及数据亲和性的需求

负责管理Pod部署的系统主要负责将Pod部署至特定Node。在调度过程中综合考量Cluster拓扑结构、各节点的工作负载状况以及应用对高可用性、性能指标及数据亲和性的需求

3.3、Controller-Manager

负责关注所有Controller(控制器)的工作状态,并保证每个Controller都是 healthy. 此外, 每个Controller都是保证Pod healthy的重要组件.

3.4、etcd

负责管理存储K8s Cluster的各资源状态数据。每当数据状态变化时, etcd能够迅速地进行状态通知。

3.5、Pod网络

Pod能通信,k8s cluster必须部署Pod网络(比如flannel是其中一个方案)

3.6、Kubelet

该系统充当Node代理角色,在调度器决定将 Pod 部署到某一个 Node 时会主动发起操作。具体而言,在此过程中调度器会传递 Pod 的详细配置参数包(包括 image 和 volume 等关键细节),而 kubelets 单元格则利用这些数据生成并启动相应的容器实例,并持续向主服务汇报运行状态。

3.7、Kube-proxy

从逻辑结构来看, Service相当于后端多容器Pod的集合体. 当外部请求通过Service发起时, Service会接收到来自各个方向的需求. 这一过程, kube-proxy的主要职责就是处理这一过程. 每一个节点都会启动并运行一个kube-proxy服务, 该服务会将来自Service的所有TCP/UDP流量转发至对应的容器资源.

二、Kubernetes集群搭建

1、环境准备

本次使用docker 18.09.9和kubelet-1.16.4,要求centos7.6以上版本

[root@localhost ~]# cat /etc/centos-release

CentOS Linux release 7.6.1810 (Core)

1.1关闭selinux

查看selinux是否关闭

[root@localhost ~]# getenforce

Disabled

先设置临时关闭:setenforce 0

永久关闭:vi /etc/sysconfig/selinux

设置SELINUX=disabled

1.2 、关闭swap

k8s要求系统关闭,否则安装过程会报错,查看系统是否关闭了swap

临时禁用:swapoff -a

永久禁用:sed -i.bak '/swap/s/^/#/' /etc/fstab ##注释掉swap那一行

作用就是修改/etc/fstab配置为如下:

vi /etc/fstab

注释掉代码:

#/dev/mapper/centos-swap swap swap defaults 0 0

1.3**、配置ip_forward转发******

ip_forward配置文件当前参数设置为0,则意味著数据包转发被阻止;将其更改为1则意味著数据包转发将被允许

命令:echo "1" > /proc/sys/net/ipv4/ip_forward

1.4**、更新docker源与k8syum源******

为了将下载源一次性配置好, 我们将centos7软件源、docker源以及k8s源统一地设置好了。

先清除掉系统自带配置cd /etc/yum.repos.d/

复制代码
 [root@bogon ~]# cd /etc/yum.repos.d/

    
 [root@bogon yum.repos.d]# ll
    
 total 36
    
 -rw-r--r--. 1 root root 1664 Nov 23  2018 CentOS-Base.repo
    
 -rw-r--r--. 1 root root 1309 Nov 23  2018 CentOS-CR.repo
    
 -rw-r--r--. 1 root root  649 Nov 23  2018 CentOS-Debuginfo.repo
    
 -rw-r--r--. 1 root root  314 Nov 23  2018 CentOS-fasttrack.repo
    
 -rw-r--r--. 1 root root  630 Nov 23  2018 CentOS-Media.repo
    
 -rw-r--r--. 1 root root 1331 Nov 23  2018 CentOS-Sources.repo
    
 -rw-r--r--. 1 root root 5701 Nov 23  2018 CentOS-Vault.repo
    
 -rw-r--r--  1 root root 2640 Dec  4 15:58 docker-ce.repo
    
 [root@bogon yum.repos.d]# rm -rf *
    
 [root@bogon yum.repos.d]# ll
    
 total 0

1)下载centos7的源和docker源:

download -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

download -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo

download https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

结果如下:

复制代码
 [root@bogon yum.repos.d]# ll

    
 total 12
    
 -rw-r--r-- 1 root root 2523 Jun 16  2018 CentOS-Base.repo
    
 -rw-r--r-- 1 root root 2640 Mar 16 18:38 docker-ce.repo
    
 -rw-r--r-- 1 root root  664 May 11  2018 epel-7.repo

2)配置k8s

复制代码
 cat <<EOF > /etc/yum.repos.d/kubernetes.repo

    
 [kubernetes]
    
 name=Kubernetes
    
 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    
 enabled=1
    
 gpgcheck=0
    
 EOF

3)刷新yum缓存

命令:yum clean all && yum makecache fast

1.5**、安装**docker

docker使用版本18.09.9

命令:yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

k8s运行要求docker的--cgroup-driver=systemd

复制代码
 cat /etc/docker/daemon.json

    
 [root@bogon yum.repos.d]# cat /etc/docker/daemon.json
    
 {
    
         "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
    
         "insecure-registries":["192.168.30.161:5000"]
    
 }

启动docker并设置开机启动:

命令:systemctl enable docker && systemctl start docker

1.6**、安装k8s组件******

命令:yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4

设置开机启动:

systemctl enable kubelet && systemctl start kubelet

添加kubectl上下文到环境中:

echo "source <(kubectl completion bash)" >> ~/.bash_profile

source .bash_profile

在家目录中,配置生效:

[root@bogon ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile

[root@bogon ~]# source .bash_profile

1.7**、内核参数修改******

通常k8s网络会采用flannel机制。对于桥接网卡内核参数来说,bridge-nf-call-iptables必须配置为1。

添加参数配置文件:vi /etc/sysctl.d/k8s.conf

net.bridges.bridges utilize-iptables-tables=1

net.bridges.bridges utilize-ip6-tables=1

执行命令:

sysctl -p /etc/sysctl.d/k8s.conf

至此,环境准备工作完毕。

1.8、内核参数修改失败常见问题

在某些系统中运行sysctl -p /etc/sysctl.d/k8s.conf可能会遇到错误,在这种情况下通常需要该参数的修改依赖于系统的br_netfilter模块是否存在。可以通过lsmod | grep br_netfilter命令来确认该模块是否被启用。

没有则新增br_netfilter模块:modprobe br_netfilter

上述方式重启后无效。需要配置系统启动加载脚本使其永久生效:

1)先加开机启动动作:

The vi command is used to edit files, and this script configures it to work with the rc.sysinit system initialization file located at /etc/rc.sysinit.

2)再做加载模块动作:

在终端中使用vi编辑器切换到另一个终端窗口并执行modprobe br_netfilter命令以启用网络滤镜模块

3)再增加执行权限:

[root@bogon ~]# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

2、Master节点配置

2.1**、Master节点初始化******

命令:kubeadm开始部署 --container存储库 registry.aliyuncs.com/google_container --kubernetes版本 v1.16.4 --网络CIDR地址范围设置为 192.168.0.0/25

这一步,如果出现下面错误,则是前面的1.6节点内核没有配置,正常情况如下:

出现这一步,恭喜你,已经成功一大半了!,复制加入节点的命令。

这里本地安装的信息如下:

命令:kubeadm join 192.168.30.161:6443 --token k1pe7l.tqze8jxrltk9elds --discovery-token-ca-cert-hash sha256:865e1169ec58773850b496678c1b3ab252683b014ef899e68ccf4ac826528412

接下来,我们按它的提示执行操作:

mkdir -p $HOME/.kube

执行提示操作:

执行以下操作:使用cp命令将/etc/kubernetes/admin.conf文件并包含隐藏文件复制到HOME/.config/kube目录下。 执行以下操作:确保HOME/.kube/config目录拥有(id -u):(id -g)权限。

备注:

Kubernetes 的严重阻碍或致命缺陷:无法连接到服务器(错误码:x509;证书由未知权威签名)

问题复现****:****

昨天依据教程搭建了一个集群,并打算对它进行重置测试。今天决定重新试验时,在线执行了kubeadm reset命令以清除集群中的所有配置信息。

按照部署常规流程的操作步骤进行:使用kubeadm init命令,并配置--kubernetes-version=v1.14.3、--pod-network-cidr=10.244.0.0/16以及--apiserver-advertise-address=0.0.0.0等参数来创建集群。随后,请依次执行以下操作

复制代码
 mkdir -p $HOME/.kube

    
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

当我在运行kubectl get nodes等操作指令时,所有的命令都会显示错误信息: inability to connect to the server due to X.509 certificate validation failure, which may be caused by issues related to RSA certificate verification during the attempt to validate the 'kubernetes' authority certificate

当启用这些 kubectl 命令后并伴随 --insecure-skip-tls-verify 参数时,则会引发如下错误:error: 须登录服务器(Unauthorized)

问题解决:mkdir -p $HOME/.kube

这些命令将创建一个目录并复制一些配置文件,在重新创建集群的过程中此目录仍然存在;因此,在开始这些操作之前我运行了rm -rf $HOME/.kube命令来清除该目录;最终问题得到了妥善解决。

2.2**、添加flannel的网络******

参考大师的建议下

执行命令:kubectl apply -f hankin-flannel.yml

复制代码
 [root@localhost ~]# kubectl apply -f hankin-flannel.yml

    
 podsecuritypolicy.policy/psp.flannel.unprivileged created
    
 clusterrole.rbac.authorization.k8s.io/flannel created
    
 clusterrolebinding.rbac.authorization.k8s.io/flannel created
    
 serviceaccount/flannel created
    
 configmap/kube-flannel-cfg created
    
 daemonset.apps/kube-flannel-ds-amd64 created
    
 daemonset.apps/kube-flannel-ds-arm64 created
    
 daemonset.apps/kube-flannel-ds-arm created
    
 daemonset.apps/kube-flannel-ds-ppc64le created
    
 daemonset.apps/kube-flannel-ds-s390x created
    
 [root@localhost ~]#

至此,大功告成

2.3**、查看集群******

查看k8s集群:kubectl get nodes

3、work节点初始化

工作节点的设置相比master相对较为繁琐, 但只需合理规划节点名称即可完成任务

注意master节点初始化完成之后会有其他节点加入集群的提示命令。

3.1**、设置机器名******

设置一个机器名为work1(192.168.30.162)

[root@bogon ~]# hostnamectl set-hostname work1

配置对应的ip:vi /etc/hosts

添加配置:192.168.30.162 work1

3.2**、加入集群******

在参与 master 初始化的工作节点机器上, master 初始化过程中发出的 join 请求, 即被纳入 master 的管理范围内。

这里将192.168.30.162(work1)、192.168.30.163(work2)两台机器作为work加入集群。

执行master节点初始化完成后生成的加入集群命令:

kubeadm connect 位于美国 west海岸 的服务器地址:端口 6443 --ca certification hash token value set to a SHA-256 hash string --discovery-token-ca-cert-hash sha256:8a0dccb3d90d9edfbbbebfbdabbbeabbbeabfbaaebeabfbaaebeabfbaaebeabfbaaebeabfbaaebeab

回到master节点再次查看集群:kubectl get nodes

同样的操作将节点work2(192.168.30.163)加入到集群:kubectl get nodes

4、备注:

4.1、加入master节点命令失效问题

master中的节点认证信息24小时会失效,可以重新生成(master端操作)

重新生成用于节点加入集群的认证命令

1)创建token

[root@master ~]# kubeadm token create

pno0i6.hmhqm0qrf8n4hf4e

2)创建新的sha

openssl x509 --public-key --input-file /etc/... | openssl rsa --input-cipher --outform der sha256 --hex | sed 's/([ ]*)//g'

****3)****加入集群(node操作)

kubeadm join 172.16.20.102:6443 --token [token] --discovery-token-ca-cert-hash sha256:[sha值]

******4.2、**初始化Kubernetes端口占用问题

解决方案:发现杀死进程都没有用,最终重启一下kubeadm就可以了,如下:

kubeadm reset

脱离集群命令也是这个

4.3、重启kubelet

systemctl daemon-reload

systemctl restart kubelet

全部评论 (0)

还没有任何评论哟~