Kubernetes容器云平台入门与进阶
文章目录
Kubernetes多节点
三副本机制,master最少三台,每台master的node最少三个,备份三份等
Kubernetes简介
Kubernetes
Kubernetes是Google在2014年开源的一个容器群集管理系统,Kubernetes简称K8S。
发展:
1.mesos+zookeeper+marathon 架构
2.docker+swarm 容器群集管理
3.kubernetes 开源框架 —>二次开发 API接口 舵手(Go语言开发)
K8S用于容器化应用程序的部署,扩展和管理。
K8S提供了容器编排,资源调度,弹性伸缩,部署管理。服务发现等一系列功能。
部署管理:无状态、有状态—>由控制器完成。
服务发现:ETCD—>相当于分布式数据库(自动的服务发现)。(ETCD在生产环境最少三台起步)
Kubernetes目标是让部署容器化应用简单高效
官方网站:http://www.kubernetes.io
Kubernetes特性
自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死将康检查失败的容器,并且在为准备好之前不会处理客户端请求,确保线上服务部中断。
弹性伸缩
使用命令、UI或者加基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务地缝时挥手资源,以最小成本运行服务。
自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果封信过程中出现问题,将回滚更改,确保升级不受影响业务。
服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(管理方的入口,客户端的入口)(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
机密和配置管理
管理机密数据和应用程序配置,而不需要吧敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为群集资源的一部分,几大提高存储使用灵活性
批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
单节点Kubernetes
三个节点:master主控节点 node1 node2
kubectl 管理人员操作的操作指令
两个node:提供业务
两个入口:一个是客户端访问的,一个是管理员访问的
两种方式管理资源:kubectl、YAML文件
Kubernetes核心概念
-
Pod
最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的 -
Controllers
ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:用状态应用部署
DaemonSet:确保所有Node节点运行在同一个Pod
Job:一次性任务
Cronjob:定时任务
更高层次对象,部署和管理Pod -
Service
防止Pod失联
定义一组Pod的访问策略 -
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
-
Namepaces:命名空间,将对象逻辑上隔离
-
Annotations:注释
Kubernetes集群部署(单节点)
官方提供的三种部署方式
- minikube
Minkube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开的用户使用
部署地址:https://kubernetes.io/docs/setup/minikube/ - kubeadm
Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
部署地址:https://kubernetes.io/docs/setup-tools/kubeadm/kubeadm/ - 二进制包
推荐,从官方下载发行的二进制包,手动部署每个组件,组成Kubernetes集群
下载地址:https://github.com/kubernetes/kubernetes/releases
自签SSL证书
etcd:ca.pem server.pem server-key.pem
flannel:ca.pem server.pem server-key.pem
kube-apiserve:ca.pem server.pem server-key.pem
kubelet:ca.pem ca-key.pem
kube-proxy:ca.pem kube-proxy.pem kube-proxy-key.pem
kubectl:ca.pem admin.pem admin-key.pem
Etcd数据库群集部署
etcd具有以下特点:
完全复制:集群中的每个节点都可以使用完整的存档
高可用性:Etcd可用于避免硬件的单点故障或网络问题
一致性:每次读取都会返回跨多主机的最新写入
简单:包括一个定义良好、面向用户的API(gRPC)
快速:每秒10000次写入的基准速度
可靠:使用Raft算法实现强一致性、高可用服务存储目录
Node安装Docker
Flannel容器群集网络部署
flannel网络组件
Overlay Network:覆盖网络,在基础网络叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来。
VXLAN:将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。
Flannel:是Overlay网络的一种。也是将源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VXLAN、VPC和GCE路由等数据转发方式。
部署Master组件
负责管理Kubernetes集群。它们管理pod的生命周期,pod是Kubernetes集群内部署的基本单元。
- kube-apiserver 主要组件,为其他master组件公开API。
- etcd 分布式密钥/值存储库,Kubernetes使用它来持久化存储所有集群信息。
- kube-scheduler 依照pod规范中的信息,来决定运行pod的节点。
- kube-controller-manager 负责节点管理(检测节点是否出现故障)、pod复制和端点创建。
- cloud-controller-manager 守护进程,充当API和不同云提供商工具(存储卷、负载均衡器等)之间的抽象层。
部署Node组件
节点组件是Kubernetes中的worker机器,受到master的管理。节点可以是虚拟机(VM)或物理机器——Kubernetes在这两种类型的系统上都能良好运行。
每个节点都包含运行pod的必要组件:
- kubelet 为位于那个节点上的pod监视API服务器,确保它们正常运行
kubelet处理着master和在其上运行的节点之间的所有通信。它以manifest的形式接收来自主设备的命令,manifest定义着工作负载和操作参数。它与负责创建、启动和监视pod的容器运行时进行接合。
kubelet还会周期性地对配置的活跃度探针和准备情况进行检查。它会不断监视pod的状态,并在出现问题时启动新实例。kubelet还有一个内部HTTP服务器,在端口10255上显示一个只读视图。除此之外,在/healthz上还有一个健康检查端点,以及一些其他状态端点。例如,我们可以在/pods获取正在运行的pod的列表。我们还可以在/spec获取kubelet正在运行的机器的详情。 - cAdvisor 收集在特定节点上运行着的pod的相关指标
- kube-proxy 监视API服务器,实时获取pod或服务的变化,以使网络保持最新
- kube-proxy组件在每个节点上运行,负责代理UDP、TCP和SCTP数据包(它不了解HTTP)。它负责维护主机上的网络规则,并处理pod、主机和外部世界之间的数据包传输。它就像是节点上运行着的pod的网络代理和负载均衡器一样,通过在iptables使用NAT实现东/西负载均衡。
容器运行时 负责管理容器镜像,并在该节点上运行容器
实验
所有节点清空防火墙规则和关闭核心防护
iptables -F
setenforce 0
一:环境部署
官网地址:https://github.com/kubernetes/kubernetes/releases?after=v1.13.1
二:K8S部署
环境
master:192.168.20.10 kube-apiserver kube-controller-manager kube-scheduler etcd
node1:192.168.20.20 kubelet kube-proxy docker flannel etcd
node2:192.168.20.30 kubelet kube-proxy docker flannel etcd
//证书制作
//master操作
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# mkdir k8s
[root@master ~]# cd k8s/
[root@master k8s]# ls //从宿主机拖进来
etcd-cert.sh etcd.sh
[root@master k8s]# mkdir etcd-cert
[root@master k8s]# mv etcd-cert.sh etcd-cert
//下载证书制作工具
[root@master k8s]# cd etcd-cert/
[root@master etcd-cert]# vim cfssl.sh
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
[root@master etcd-cert]# bash cfssl.sh //下载cfssl官方包
或
[root@master etcd-cert]# ls 下载软件包拖入
cfssl cfssl-certinfo cfssljson etcd-cert etcd.sh
[root@master etcd-cert]# mv cfssl* /usr/local/bin/
[root@master etcd-cert]# chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
[root@master etcd-cert]# ls /usr/local/bin/
cfssl cfssl-certinfo cfssljson
//开始制作证书
//cfssl 生成证书工具 cfssljson通过传入json文件生成证书
cfssl-certinfo查看证书信息
//定义ca证书
[root@master etcd-cert]# cat > ca-config.json <<EOF
> {
> "signing": {
> "default": {
> "expiry": "87600h"
> },
> "profiles": {
> "www": {
> "expiry": "87600h",
> "usages": [
> "signing",
> "key encipherment",
> "server auth",
> "client auth"
> ]
> }
> }
> }
> }
> EOF
//实现证书签名
[root@master etcd-cert]# cat > ca-csr.json <<EOF
> {
> "CN": "etcd CA",
> "key": {
> "algo": "rsa",
> "size": 2048
> },
> "names": [
> {
> "C": "CN",
> "L": "Beijing",
> "ST": "Beijing"
> }
> ]
> }
> EOF
//生成证书,生成ca-key.pem ca.pem
[root@master etcd-cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
2020/09/28 16:11:29 [INFO] generating a new CA key and certificate from CSR
2020/09/28 16:11:29 [INFO] generate received request
2020/09/28 16:11:29 [INFO] received CSR
2020/09/28 16:11:29 [INFO] generating key: rsa-2048
2020/09/28 16:11:30 [INFO] encoded CSR
2020/09/28 16:11:30 [INFO] signed certificate with serial number 307109152987071081700641248999918396111229161596
//指定etcd三个节点之间的通信验证
[root@master etcd-cert]# cat > server-csr.json <<EOF
> {
> "CN": "etcd",
> "hosts": [
> "192.168.20.10", //master地址
> "192.168.20.20", //node1地址
> "192.168.20.30" //node2地址
> ],
> "key": {
> "algo": "rsa",
> "size": 2048
> },
> "names": [ //名字要和上面定义的一样
> {
> "C": "CN",
> "L": "BeiJing",
> "ST": "BeiJing"
> }
> ]
> }
> EOF
//生成ETCD证书 server-key.pem server.pem
[root@master etcd-cert]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
2020/09/28 16:12:52 [INFO] generate received request
2020/09/28 16:12:52 [INFO] received CSR
2020/09/28 16:12:52 [INFO] generating key: rsa-2048
2020/09/28 16:12:52 [INFO] encoded CSR
2020/09/28 16:12:52 [INFO] signed certificate with serial number 538862372957746116117729195241060280056748061751
2020/09/28 16:12:52 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
//ETCD 二进制包地址 https://github.com/etcd-io/etcd/releases
//拖入flannel-v0.10.0-linux-amd64.tar.gz、etcd-v3.3.10-linux-amd64.tar.gz、kubernetes-server-linux-amd64.tar.gz
[root@master etcd-cert]# ls
ca-config.json etcd-cert.sh server-csr.json
ca.csr etcd-v3.3.10-linux-amd64.tar.gz server-key.pem
ca-csr.json flannel-v0.10.0-linux-amd64.tar.gz server.pem
ca-key.pem kubernetes-server-linux-amd64.tar.gz
ca.pem server.csr
[root@master etcd-cert]# mv *.tar.gz ../
[root@master etcd-cert]# cd ..
[root@master k8s]# ls
cfssl.sh etcd.sh flannel-v0.10.0-linux-amd64.tar.gz
etcd-cert etcd-v3.3.10-linux-amd64.tar.gz kubernetes-server-linux-amd64.tar.gz
//解压etcd-v3.3.10-linux-amd64.tar.gz
[root@master k8s]# tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
[root@master k8s]# ls etcd-v3.3.10-linux-amd64
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
//创建目录——配置文件,命令文件,证书
[root@master k8s]# mkdir /opt/etcd/{
cfg,bin,ssl} -p
[root@master k8s]# mv etcd-v3.3.10-linux-amd64/etcd etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/
//证书拷贝
[root@master k8s]# cp etcd-cert/*.pem /opt/etcd/ssl/
//进入卡住状态等待其他节点加入
[root@master k8s]# bash etcd.sh etcd01 192.168.20.10 etcd02=https://192.168.20.20:2380,etcd03=https://192.168.20.30:2380
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
//再使用另外一个会话打开,会发现etcd进程已经开启
[root@master k8s]# ps -ef | grep etcd
root 22521 1 2 16:41 ? 00:00:01 /opt/etcd/bin/etcd --name=etcd01 --data-dir=/var/lib/etcd/default.etcd --listen-peer-urls=https://192.168.20.10:2380 --listen-client-urls=https://192.168.20.10:2379,http://127.0.0.1:2379 --advertise-client-urls=https://192.168.20.10:2379 --initial-advertise-peer-urls=https://192.168.20.10:2380 --initial-cluster=etcd01=https://192.168.20.10:2380,etcd02=https://192.168.20.20:2380,etc03=https://192.168.20.30:2380 --initial-cluster-token=etcd-cluster --initial-cluster-state=new --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem --trusted-ca-file=/opt/etcd/ssl/ca.pem --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
root 22534 22330 0 16:42 pts/2 00:00:00 grep --color=auto etcd
//拷贝证书到node节点
[root@master k8s]# scp -r /opt/etcd/ root@192.168.20.20:/opt/
The authenticity of host '192.168.20.20 (192.168.20.20)' can't be established.
ECDSA key fingerprint is SHA256:M+6YSK2hm7e8JY4G1qYmT0X1UmIr280vvpa+1rW8IBc.
ECDSA key fingerprint is MD5:bd:01:e2:85:f0:b0:36:8c:49:64:08:30:6c:2d:a4:37.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.20.20' (ECDSA) to the list of known hosts.
root@192.168.20.20's password:
etcd 100% 509 237.4KB/s 00:00
etcd 100% 18MB 71.0MB/s 00:00
etcdctl 100% 15MB 81.1MB/s 00:00
ca-key.pem 100% 1679 1.0MB/s 00:00
ca.pem 100% 1265 1.4MB/s 00:00
server-key.pem 100% 1675 1.4MB/s 00:00
server.pem 100