1.k8s简介

Kubernetes(k8s)是 Google 开源的容器集群管理系统,其设计源于 Google 在容器编排方面积累的丰富经验,并结合社区创新的最佳实践。Kubernetes 在 Docker容器技术的基础上,大大地提高了容器化部署应用简单高效。经过几年的快速发展,Kubernetes 已经成为建设容器云平台的首选方案。

Kubernetes的好处:
隐藏资源管理和错误处理,用户仅需要关注应用的开发。
服务高可用、高可靠。
可将负载运行在由成千上万的机器联合而成的集群中。

Kubernetes主要由以下几个核心组件组成:

etcd:保存了整个集群的状态 apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理 Container
runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

除了核心组件,还有一些推荐的Add-ons:

kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口 Heapster:提供资源监控
Dashboard:提供GUI Federation:提供跨可用区的集群
Fluentd-elasticsearch:提供集群日志采集、存储与查询

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_vim

核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

2.k8s的部署

实验环境:
server5是harbor仓库端
新虚拟机:server123

server123:

vim /etc/hosts

harbor仓库的ip要有地址解析

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_02

安装docker
vim /etc/yum.repos.d/docker-ce.repo

[docker]
name=docker-ce
baseurl=http://172.25.76.250/20
gpgcheck=0

yum install docker-ce -y
systemctl enable --now docker
docker info

若出现以下报错则

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_03

cd /etc/sysctl.d/

vim docker.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

sysctl --system

修改驱动
mkdir -p /etc/systemd/system/docker.service.d
cd /etc/docker
vim daemon.json

{
  "registry-mirrors": ["https://"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}

systemctl restart docker

禁用swap分区

swapoff -a

vim /etc/fstab 注释掉/etc/fstab文件中的swap定义 防止开机自启

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_运维_04


安装部署软件kubeadm

cd /etc/yum.repos.d/

vim k8s.repo

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

yum install -y kubeadm kubeleet kubectl

systemctl enable --now kubelet

查看默认配置信息

kubeadm config print init-defaults

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_05

server1 2 3 的etc/docker 目录下都需要有认证文件 ca.crt

/etc/docker/certs.d//ca.crt

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_06

server3:

kubeadm config images list --image-repository /google_containers ## 列出所需镜像
kubeadm config images pull --image-repository /google_containers ## 拉取镜像(过程有点慢)

docker images 查看

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_07

在harbor仓库新建一个项目 (要公开)

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_vim_08

拉取得/google_containers改标签为/k8s/

docker images | grep  | awk '{print $1":"$2}' | awk -F/ '{print $3}' | awk '{system("docker tag /google_containers/"$1" /k8s/"$1"")}'

查看修改标签成功

docker images | grep 

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_vim_09

上传这些k8s文件

docker images | grep  | awk '{system("docker push "$1":"$2"")}'

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_10

提示被拒绝

则登陆

docker login

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_11

当出现密码或用户名输入错误的提示时

解决办法: 重新登陆一次

[root@server3 ~]# docker logout 
Removing login credentials for 
[root@server3 ~]# docker login 
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

再来一次

docker images | grep  | awk '{system("docker push "$1":"$2"")}'

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_12

成功

初始化集群
用/google_container有一个拉取不下来会报错 所以用刚才将所有镜像都上传的私有仓库来初始化就不会出错而且速度快。

kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository /k8s

生成的kubeadm join 需要待会用来加入集群

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_13


初始化后,提示操作,此处的操作需要复制粘贴保存起来,方便后续使用。

这里我们时root用户,所以选择按照提示配置环境变量。

export KUBECONFIG=/etc/kubernetes/admin.conf

将k8s的指定配置文件写进环境变量

vim .bash_profile

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_14

我们需要用kubectl指令来完成后续动作,所以需要在~/.bashrc

中将kubectl补齐的指令写进去

echo "source <(kubectl completion bash)" >> ~/.bashrc
kubectl get pod -n kube-system

我们会发现有状态是pending而不是runnning

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_运维_15

原因是没有安装flannel网络组件

3.安装flannel网络组件

3.1.拉取flannel最新版本

网址:https:///coreos/flannel

我们在server3拉取flannel并上传到私有仓库

docker pull quay.io/coreos/flannel:v0.14.0
docker tag quay.io/coreos/flannel:v0.14.0 /library/flannel:v0.14.0
docker push /library/flannel:v0.14.0

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_运维_16

3.2.下载yml文件

直接从网上wget将yml文件下载下来如下:

yum install -y wget

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

vim kube-flannel.yml

只需要改一下镜像的版本

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_初始化_17


kubectl apply -f kube-flannel.yml

再次查看k8s的pod状态就都是running状态了

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_docker_18

3.3.加入k8s集群

将刚才初始化生成的指令复制下来,在server1 2上执行,使得他们加入集群

kubeadm join 172.25.76.3:6443 --token omljmj.uci7zmsmyyxxkmgu --discovery-token-ca-cert-hash sha256:3e04d3f0d04ae1f26bcc71c2f614c3640a92e1e5cf79eb63c8a8267f9b9a25c3

在master端查看节点状态
要是都是ready就代表成功

kubectl get nodes

kubernetes 集群化部署 降低硬件资源需求 kubernetes大规模集群_vim_19


查询状态,以及pod 等都显示正常,集群部署就成功