本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告

K8S教程(1)K8S介绍与kubeadm部署教程

发布:TangLu2019-5-30 13:26分类: Docker+K8S 标签: docker k8s kubernetes

一、什么是K8S

K8S全称是Kubernetes,它是由谷歌开发的一款Docker容器编排工具。由于其有自动调度、容器自我修复、水平扩展、服务发现、负载均衡、自动发布和回滚等特色功能,短短几年时间就占据了80%的使用份额。容器编排工具主要的作用就是让容器作为集群在分布式环境中工作,适用于现在的微服务架构,各个应用以服务的形式运行在各自的容器中。在容器技术诞生初期,使用的编排工具主要有docker compose和docker swarm,前者主要面向于单机编排,而docker swarm是docker官方开发的一款可以将多个docker放入一个资源池中,再让compose对这个资源池进行编排形成集群管理的工具。

在企业中落地K8S需要解决的问题:

1、交付到K8S中的程序或者服务如何对外提供服务

2、容器跨宿主机的通信问题

3、K8S监控和日志收集问题

4、CI/CD的实现

5、如何平滑迁移服务到K8S集群


二、K8S的工作模式与常用组件

K8S集群系统采用了Master / Node架构,由一个或多个中心节点(Masters)来对多个工作节点(Node)进行择优调度,实现资源整合并提供服务K8S并不会直接调度容器的运行,而是调度POD(POD是K8S的最小调度单位,可以理解为容器的外壳,把容器进行了封装)。而用户通过Service访问这些资源(Service是一组提供相同服务的Pod的对外访问接口,有点像负载均衡的VIP)。简单来说就是多个容器组成Pod,多个Pod组成Service,用户通过Service访问服务。

1、K8S中的对象单元介绍

Pod:K8S中的最小部署单元,一个Pod由一个或多个容器组成

Service:为提供相同服务的一个多或个Pod定义一个endpoint访问入口,还会分配一个集群IP。

Lable:标签,用于区分Pod、Service等对象,每个对象可以有多个标签

Deployment:Pod控制器,用于管理Pod,比如Pod需要以什么状态启动几份等

Ingress:和Service有点类似,只不过Service是对内部而言,Ingress是对外部而言。Ingress会把K8S中的服务顶出来,这样就可以让外部的其他服务(比如KVM)能调用K8S中的服务


2、中心节点(Master)核心组件介绍

ETCD:可以理解为K8S的数据库或者注册中心,需要配置为高可用集群并支持https协议

API Server:整个系统的对外接口,供客户端和其它组件调用,是集群大脑的角色

Scheduler:负责对集群内部的资源进行调度,根据一个优选策略对Pod的分部进行调度

Controller-Manager:集群大管家,管理所有Pod的运行状态,保证它们按照预定的配置去运行,比如Pod占用的资源、运行多长时间等


3、运算节点(Node)核心组件介绍

kubelet:负责与底层的Docker进行交互

kube-proxy:生成ipvs或iptables规则实现负载均衡

docker:负责创建容器


4、Addons插件介绍

flannel:网络组件,帮助Pod跨宿主机进行通信

coredns:维护Service的名称解析

traefik:Ingress的一种软件实现方式


三、K8S的安装方式

k8s托管在github上(https://github.com/kubernetes)。要安装K8S集群的话常用以下2种方式:

1、二进制部署,适合生产。用户需要把Master中心节点的所有组件通通安装,同理Node节点也需要安装对应的核心组件,还需要手动配置多组CA证书,过程非常繁琐。

2、使用K8官方推出的集群管理工具kubeadm。它把原本需要自己部署的组件通过镜像方式拉到本地进行使用,由于证书不是自签,面临过期问题,适合学习K8S使用。用户只需要安装好kubelet和docker,然后每个Master和Node节点上安装kubeadm即可,通过kubeadm init把第一个节点初始化为Master;通过kubeadm join将其他节点初始化为Node并加入集群。


四、K8S的安装(采用kubeadm方式)

1、首先保证每个节点时间同步、selinux、iptables规则已经清空,hosts互通,已经安装好Docker

2、配置阿里云Docker-ce和K8S的YUM源,Docker-CE的yum配置与安装可以参考Docker安装的文章

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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


3、yum安装kubelet、kubeadm、kubectl(客户端)并启动服务。

yum install -y kubelet kubeadm kubectl docker-ce
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet


五、K8S主节点部署与配置

1、由于K8S不支持SWAP分区,如果系统有SWAP分区的话K8S无法正常安装,所以需要配置初始化选项,让其忽略因为SWAP分区产生的告警

vi /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"


2、打开系统中iptables桥接相关配置

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward


3、由于kubeadm会从国外网站拉取镜像,当进行初始化的时候会出现failed to pull image k8s.gcr.io的错误。为了解决这个问题,需要手动下载镜像到本地,再修改tag

#拉取镜像
docker pull mirrorgooglecontainers/kube-apiserver:v1.14.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.2
docker pull mirrorgooglecontainers/kube-scheduler:v1.14.2
docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.3.10
docker pull coredns/coredns:1.3.1

#修改tag
docker tag mirrorgooglecontainers/kube-apiserver:v1.14.2  k8s.gcr.io/kube-apiserver:v1.14.2
docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.2 k8s.gcr.io/kube-controller-manager:v1.14.2
docker tag mirrorgooglecontainers/kube-scheduler:v1.14.2 k8s.gcr.io/kube-scheduler:v1.14.2
docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd-amd64:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

#删除多余镜像,节约篇幅只写了1条
docker rmi mirrorgooglecontainers/kube-proxy:v1.14.2
docker rmi mirrorgooglecontainers/kube-apiserver:v1.14.2
docker rmi mirrorgooglecontainers/kube-controller-manager:v1.14.2
docker rmi mirrorgooglecontainers/kube-scheduler:v1.14.2
docker rmi mirrorgooglecontainers/etcd-amd64:3.3.10
docker rmi mirrorgooglecontainers/pause:3.1
docker rmi docker.io/coredns/coredns:1.3.1


4、使用kubeadm init 初始化,并且关注命令运行后的提示,如下:

kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap  
#--pod-network-cidr:指定POD私有网络的IP地址段
#--ignore-preflight-errors:忽略因为系统配置SWAP而产生的错误
#命令成功执行后应该能看到下面几条信息
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!


5、启动集群之前,还需要在一个普通用户账号下做以下操作(当然要用root也是可以的)

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


如果初始化出现问题可以将初始化状态清理掉重新进行

kubeadm reset


6、验证K8S集群服务状态,看到是NotReady状态,这是因为还没有网络组件

k8s.png

kubectl get cs
kubectl get nodes


7、为主节点配置网络组件flannel,通过https://github.com/coreos/flannel页面下方的Deploying flannel manually
可以找到一键部署的命令,运行完成后docker images也可以看到flannel的镜像。

k8s2.png


8、查看namespace里的信息以验证flannel镜像是否拉取成功

kubectl get ns  #查看所有namespace
kubectl get pods -n kube-system  #查看指定namespace下的pods


k8s3.png


9、Master配置到这里已经完成


六、K8S Node节点部署与配置


1、忽略SWAP告警

vi /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"


2、打开系统中iptables桥接相关配置

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward



3、下载镜像并修改TAG,参照Master节点的配置即可

4、将新节点加入集群,该命令是Master初始化完成后最后一段内容,建议保存好,因为包含了token信息,以后要加入节点都是运行该命令。

kubeadm join 192.168.145.185:6443 --token 3g743d.h9t34niq0k3n73sx --discovery-token-ca-cert-hash sha256:ac13fc140298b3665e0436d353d94fed494e36b52485df532b4bb719bd6d2e11 --ignore-preflight-errors=Swap  #这里的IP就是第一个主节点IP


5、在主节点使用kubectl get nodes验证状态为Ready,角色为<none>代表它可以成为其他角色。至此Node节点配置完毕

k8s4.png

k8s5.png

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《K8S教程(1)K8S介绍与kubeadm部署教程
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-473.html  [生成短网址]

已有 0/859 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~