Kubernetes容器云平台入门与进阶+单节点实验

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值