单master节点 使用kubeadm 部署k8s 简书

1、简介及规划部署:

云原生生态系统:

http://dockone.io/article/3006

CNCF 最新景观图:

 https://landscape.cncf.io/

CNCF 元原生主要框架简介:

https://www.kubernetes.org.cn/5482.html

kubernetes 设计架构: https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84

K8s 核心优势:

基于 yaml 文件实现容器的自动创建、删除

更快速实现业务的弹性横向扩容

动态发现新扩容的容器并对自动用户提供访问

更简单、更快速的实现业务代码升级和回滚

 

2、k8s 组件介绍:

 https://k8smeetup.github.io/docs/admin/kube-apiserver/

kube-apiserver:Kubernetes API server 为 api 对象验证并配置数据,包括 pods、 services、 replicationcontrollers 和其它 api 对象,API Server 提供 REST 操作和到集群共享状态的前端, 所有其他组件通过它进行交互。

https://k8smeetup.github.io/docs/admin/kube-scheduler/

kube-scheduler 是一个拥有丰富策略、能够感知拓扑变化、支持特定负载的功能组件,它对 集群的可用性、性能表现以及容量都影响巨大。scheduler 需要考虑独立的和集体的资源需 求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范、数据位置、内部负载接口、 截止时间等等。如有必要,特定的负载需求可以通过 API 暴露出来。

 https://k8smeetup.github.io/docs/admin/kube-controller-manager/

kube-controller-manager:Controller Manager 作为集群内部的管理控制中心,负责集群内的 Node、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、 资源定额(ResourceQuota)的管理,当某个 Node 意外宕机时,Controller Manager 会及时发 现并执行自动化修复流程,确保集群始终处于预期的工作状态。

https://k8smeetup.github.io/docs/admin/kube-proxy/

kube-proxy:Kubernetes 网络代理运行在 node 上,它反映了 node 上 Kubernetes API 中定 义的服务,并可以通过一组后端进行简单的 TCP、UDP 流转发或循环模式(round robin)) 的 TCP、UDP 转发,用户必须使用 apiserver API 创建一个服务来配置代理,其实就是 kubeproxy 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务访问。

https://k8smeetup.github.io/docs/admin/kubelet/

kubelet:是主要的节点代理,它会监视已分配给节点的 pod,具体功能如 下:

 向 master 汇报 node 节点的状态信息

接受指令并在 Pod 中创建 docker 容器

准备 Pod 所需的数据卷

返回 pod 的运行状态

在 node 节点执行容器健康检查

https://github.com/etcd-io/etcd

etcd: etcd 是 CoreOS 公司开发目前是 Kubernetes 默认使用的 key-value 数据存储系统,用于保存 所有集群数据,支持分布式集群功能,生产环境使用时需要为 etcd 数据提供定期备份机制。

 https://kubernetes.io/zh/docs/concepts/overview/components/ #新版本组件介绍

3、部署规划图:

安装方式:

部署工具: 使用批量部署工具如(ansible/ saltstack)、手动二进制、kubeadm、apt-get/yum 等方式安装, 以守护进程的方式启动在宿主机上,类似于是 Nginx 一样使用 service 脚本启动。

kubeadm:

https://kubernetes.io/zh/docs/setup/independent/create-cluster-kubeadm/ #beta 阶段。

 使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的方式运行。

kubeadm 介绍:

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

#V1.10 版本 kubeadm 介绍: https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

4、部署过程

安装注意事项: 注意:禁用 swap,selinux,iptables

安装环境介绍

操作系统 CentOS 7 做小化安装

192.168.111.150  master    

192.168.111.151  node01

192.168.111.152  node02

 

修改主机名

hostnamectl set-hostname k8s-master

hostnamectl set-hostname k8s-node01

hostnamectl set-hostname k8s-node02

配置DNS域名解析

vim /etc/hosts

192.168.111.150  k8s-master 

192.168.111.151  k8s-node01

192.168.111.152  k8s-node02

151.101.76.133 raw.githubusercontent.com

 

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

 

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

 

关闭swap

swapoff -a

sed -i '[email protected]^[^#].*[email protected]# &@' /etc/fstab

 

优化内核参数

vim /etc/sysctl.conf

 net.ipv4.ip_forward = 1

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

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

sysctl –p

Docker 安装步骤:

https://blog.csdn.net/TheFlsah/article/details/105767936

配置docker  加速器

vim /etc/docker/daemon.json

 

{

  "exec-opts":["native.cgroupdriver=systemd"],

  "registry-mirrors": ["https://kqw6bba7.mirror.aliyuncs.com"]

}

 

重启 docker

systemctl daemon-reload

systemctl restart docker

 

配置kubernetes 源

阿里云镜像地址:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11szSX0Y

vim /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

 

导入阿里云 镜像密钥

wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

rpm --import yum-key.gpg

rpm --import rpm-package-key.gpg

 

所有节点 安装kubelet  kubectl kubeadm

yum install -y kubelet-<version>  kubectl-<version>  kubeadm-<version> (安装指定版本的k8s,这里不指定版本,默认安装最新版本)

yum install -y kubelet  kubectl  kubeadm

启动kubelet

systemctl enable kubelet  

systemctl start kubelet

 

kubeadm 命令使用:

Available Commands:

 alpha #kubeadm 处于测试阶段的命令

 completion #bash 命令补全,需要安装 bash-completion

#mkdir /data/scripts -p

#kubeadm completion bash > /data/scripts/kubeadm_completion.sh

#source /data/scripts/kubeadm_completion.sh

#vim /etc/profile

source /data/scripts/kubeadm_completion.sh

 config #管理 kubeadm 集群的配置,该配置保留在集群的 ConfigMap 中

#kubeadm config print init-defaults

 help Help about any command

 init #启动一个 Kubernetes 主节点

 join #将节点加入到已经存在的 k8s master

 reset 还原使用 kubeadm init 或者 kubeadm join 对系统产生的环境变化

 token #管理 token

 upgrade #升级 k8s 版本

 version #查看版本信息

 

kubeadm init 命令简介:

命令使用:

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

集群初始化:

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/

[[email protected] ~]# kubeadm init --help

--apiserver-advertise-address string #K8S API Server 将要监听的监听的本机 IP

--apiserver-bind-port int32 #API Server 绑定的端口,默认为 6443

--apiserver-cert-extra-sans stringSlice #可选的证书额外信息,用于指定 API Server 的服务器证

书。可以是 IP 地址也可以是 DNS 名称。

--cert-dir string #证书的存储路径,缺省路径为 /etc/kubernetes/pki

--certificate-key string #定义一个用于加密 kubeadm-certs Secret 中的控制平台证书的密钥

--config string #kubeadm #配置文件的路径

--control-plane-endpoint string #为控制平台指定一个稳定的 IP 地址或 DNS 名称,即配置一

个可以长期使用切是高可用的 VIP 或者域名,k8s 多 master 高可用基于此参数实现

--cri-socket string #要连接的 CRI(容器运行时接口,Container Runtime Interface, 简称 CRI)套

接字的路径,如果为空,则 kubeadm 将尝试自动检测此值,"仅当安装了多个 CRI 或具有非

标准 CRI 插槽时,才使用此选项"

--dry-run #不要应用任何更改,只是输出将要执行的操作,其实就是测试运行。

--experimental-kustomize string #用于存储 kustomize 为静态 pod 清单所提供的补丁的路径。

--feature-gates string #一组用来描述各种功能特性的键值(key=value)对,选项是:

IPv6DualStack=true|false (ALPHA - default=false)

--ignore-preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略 swap,如

果为 all 就忽略所有

--image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io

--kubernetes-version string #指定安装 k8s 版本,默认为 stable-1

--node-name string #指定 node 节点名称

--pod-network-cidr #设置 pod ip 地址范围

--service-cidr #设置 service 网络地址范围

--service-dns-domain string #设置 k8s 内部域名,默认为 cluster.local,会有相应的 DNS 服务

(kube-dns/coredns)解析生成的域名记录。

--skip-certificate-key-print #不打印用于加密的 key 信息

--skip-phases strings #要跳过哪些阶段

--skip-token-print #跳过打印 token 信息

--token #指定 token

--token-ttl #指定 token 过期时间,默认为 24 小时,0 为永不过期

--upload-certs #更新证书

#全局可选项:

--add-dir-header #如果为 true,在日志头部添加日志目录

--log-file string #如果不为空,将使用此日志文件

--log-file-max-size uint #设置日志文件的最大大小,单位为兆,默认为 1800 兆,0 为没有限

--rootfs #宿主机的根路径,也就是绝对路径

--skip-headers #如果为 true,在 log 日志里面不显示标题前缀

--skip-log-headers #如果为 true,在 log 日志里里不显示标题

 

验证当前kubeadm版本

[[email protected] ~]# kubeadm version

kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbDate:"2020-04-16T11:54:15Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

 

准备镜像:

#查看安装指定版本 k8s 需要的镜像有哪些 # kubeadm config images list --kubernetes-version v<version>

 [[email protected] ~]# kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.18.2

k8s.gcr.io/kube-controller-manager:v1.18.2

k8s.gcr.io/kube-scheduler:v1.18.2

k8s.gcr.io/kube-proxy:v1.18.2

k8s.gcr.io/pause:3.2

k8s.gcr.io/etcd:3.4.3-0

k8s.gcr.io/coredns:1.6.7

 

单master节点初始化:(根据网速原因下载时间十几分钟或半小时都有可能)

推荐提前在 master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓 库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来,可以 避免后期因镜像下载异常而导致 k8s 部署异常。

# cat images-download.sh

#!/bin/bash

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controllermanager:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7

# bash images-download.sh

 

kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=v1.18.2 --apiserver-bind-port=6443 --apiserver-advertise-address=192.168.111.150 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.1.0.0/16 --ignore-preflight-errors=swap --token-ttl 0

初始化结果:

 

 

[[email protected] ~]# mkdir -p $HOME/.kube

[[email protected] ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[[email protected] ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

安装flannel插件

kubectl apply -f  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  (下载速度慢)

https://github.com/coreos/flannel/  (推荐提前下载)

[[email protected] ~]#  kubectl apply -f kube-flannel.yaml

 

验证master 节点

 

node上 输入 master 节点上的  密钥:

 

打包flannel 镜像 传到node节点(速度比较快)

[[email protected] ~]# docker save -o flannel.tar quay.io/coreos/flannel:v0.12.0-amd64

[[email protected] ~]# scp flannel.tar [email protected]:/root/

[[email protected] ~]# scp flannel.tar [email protected]:/root/

node节点载入flannel  docker镜像

docker load< flannel.tar

 

kubectl get node -o wide   查看结果