Kubernetes是一个开源的容器集群管理系统,简称K8S。在容器化应用程序的部署,扩展和管理方面有着十分权威,重要的地位,本文就其相关特性与部署流程进行了简单解析。
1.Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
(轻量级Kubernetes,k3s是经CNCF一致性认证的Kubernetes发行版,专为物联网及边缘计算设计。仅需30秒,即可启动k3s)
2.K8S用于容器化应用程序的部署,扩展和管理
3.K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能(自我修复)
4.Kubernetes目标是让部署容器化应用简单高效
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量,杀死健康检查失败的容器并且在未准备好之前不会处理客户端请求,确保线上服务不中断
使用命令,UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务(避免资源浪费)
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,(先创建后删除)如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。(回到更新之前的状态)
K8S为多个容器提供一个统一访问入口(内部ip地址和一个DNS名称)并且负载均衡关联的所有实验,使得用户无需考虑容器IP问题。
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
挂载外部存储系统,无论是来本地存储,公有云(如AWS亚马逊),还是网络存储(如NFS,GlusterFS,Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
提供一次性任务(数据一次性分析,筛选),定时任务(crontab周期性,巡检);满足批量数据处理和分析的场景。
kube-api server
Kubernetes API,集群的统一入口,各组件协调者(中央枢纽),以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给API server处理后再提交给Etcd存储
kube-controller-manager
处理集群中常规互通任务,一个资源对应一个控制器,而Controller Manager就是负责管理这些控制器的
kube-scheduler
根据调度器算法为创建的Pod选择一个Node节点,可以在任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统,(服务发现)用于保存集群状态数据,比如Pod,Service等对象信息
kubelet
kubelet是Master在Node节点上的Agent(代理),管理本机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作
docker或rocket
容器引擎,运行容器
最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的(不具备重启功能)
ReplicaSet:确保预期的Pod副本数量(限定Pod数量)
Depolyment:无状态应用部署(无身份信息,可随意取代)
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod(日志搜集,监控)
Job:一次性任务
Cronjob:定时任务
更高级层次对象,部署和管理Pod
防止Pod失联(并对外暴露服务)
定义一组Pod的访问策略
Label:标签,附加到某个资源上,用于关联对象,查询和筛选
Namespaces:命名空间,将对象逻辑上隔离(逻辑划分)
Annotations:注释
minikube
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用
kubeadm
kubeadm也是一个工具,通过kubeadm init和kubeadm join,用于快速部署Kubernetes集群
二进制包
推荐,从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群
Overlay Network:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来。(逻辑网络)
VXLAN:将源数据包封装到UDP中,并使用基础的IP/MAC(物理网络,节点ip)作为外层报文头进行封装,然后在以太网上传输(内层封装容器ip)到达目的地后由隧道端点解封装并将数据发送给目标地址。
Flannel:是Overlay网络的一种,也是将源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持UDP,VXLAN,AWS VPC和GCE路由等数据转发方式。
跨节点通信:内层ip(容器ip)作为应用层数据进行封装,传递给外部,外部进行正常的封装之后通过隧道传递,如果接收方发现目标地址是自己,就接收,并脱去外部封装,将内部数据暴露出来,传递给对应容器ip上
访问目标地址同自己在同一节点(直接通过docker 0进行交互)
如果Pod访问的ip在不同位置。
将内部ip封装成数据有效数据通过Flannel,网络传递给(ens33,eth0)物理网卡。进行正常传统MAC地址封装,通过Flannel隧道发给目标地址,最后进行解封装实现通信
重命名
[root@server1 ~]# hostnamectl set-hostname master01
[root@server1 ~]# su
[root@server2 ~]# hostnamectl set-hostname node01
[root@server2 ~]# su
[root@client1 ~]# hostnamectl set-hostname node02
[root@client1 ~]# su
关闭防火墙
[root@master01 ~]# systemctl stop firewalld
[root@master01 ~]# setenforce 0
设备K8S部署
master01 :20.0.0.10 kube-apiserver kube-controller-manager kube-scheduler etcd
node01:20.0.0.11 kubelet kube-proxy docker flannel etcd
node02:20.0.0.12 kubelet kube-proxy docker flannel etcd
在master01上
[root@master01 ~]# vi /etc/selinux/config
[root@master01 ~]# mkdir k8s
[root@master01 ~]# ls
[root@master01 ~]# cd k8s/
[root@master01 k8s]# ls
[root@master01 k8s]# mkdir etcd-cert
[root@master01 k8s]# ls
[root@master01 k8s]# 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@master01 k8s]# bash cfssl.sh
[root@master01 k8s]# cd /usr/local/bin/
[root@master01 bin]# ls
[root@master01 bin]# chmod +x *
[root@master01 bin]# ls
cfssl 生成证书工具 cfssljson通过传入json文件生成证书 cfssl-certinfo查看证书信息
[root@master01 bin]# cd /root/k8s/etcd-cert/
[root@master01 etcd-cert]# vim ca-config.json
[root@master01 etcd-cert]# ls
添加
{
"signing": {
"default": {
"expiry": "87600h" 证书有效期十年
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing", 签名
"key encipherment", 非对称密钥
"server auth", 服务端验证
"client auth" 客户端验证
]
}
}
}
}
[root@master01 etcd-cert]# vim ca-csr.json
添加
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048 密钥 长度
},
"names": [
{
"C": "CN", 地区 中国
"L": "Beijing", 城市
"ST": "Beijing"
}
]
}
[root@master01 etcd-cert]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 初始化 ca签名文件 基本认证
[root@master01 etcd-cert]# ls
[root@master01 etcd-cert]# vim server-csr.json
添加
{
"CN": "etcd",
"hosts": [
"20.0.0.10", 节点ip
"20.0.0.11",
"20.0.0.12"
],
"key": {
"algo": "rsa",
"size": 2048 密钥长度
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
ca证书 ca密钥
[root@master01 etcd-cert]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json |
cfssljson -bare server 服务签名
[root@master01 etcd-cert]# ls
https://github.com/etcd-io/etcd/releases
下载etcd-v3.3.10-linux-amd64.tar.gz 到当前目录
[root@master01 etcd-cert]# cd ..
[root@master01 k8s]# ls
[root@master01 k8s]# tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
[root@master01 k8s]# ls
[root@master01 k8s]# cd etcd-v3.3.10-linux-amd64/
[root@master01 etcd-v3.3.10-linux-amd64]# ls
[root@master01 etcd-v3.3.10-linux-amd64]# mkdir -p /opt/etcd/{
cfg,bin,ssl} {
配置文件,命令文件,证书}
[root@master01 etcd-v3.3.10-linux-amd64]# ls /opt/etcd/
[root@master01 etcd-v3.3.10-linux-amd64]# mv etcd etcdctl /opt/etcd/bin/
[root@master01 etcd-v3.3.10-linux-amd64]# ls
[root@master01 etcd-v3.3.10-linux-amd64]# ls /opt/etcd/bin/
[root@master01 etcd-v3.3.10-linux-amd64]# cd ..
[root@master01 k8s]# ls
[root@master01 k8s]# cd etcd-cert/
[root@master01 etcd-cert]# ls
[root@master01 etcd-cert]# cp *.pem /opt/etcd/ssl/
[root@master01 etcd-cert]# ls
[root@master01 etcd-cert]# cd /opt/etcd/
[root@master01 etcd]# ls
[root@master01 etcd]# cd ssl/
[root@master01 ssl]# ls
[root@master01 ~]# cd k8s/
[root@master01 k8s]# ls
[root@master01 k8s]# vim etcd.sh
[root@master01 k8s]# bash /root/k8s/etcd.sh etcd01 20.0.0.10 etcd02=https://20.0.0.11:2380,etcd03=https://20.0.0.12:2380
[root@master01 k8s]# ps -ef | grep etcd
[root@master01 k8s]# scp -r /opt/etcd/ root@20.0.0.11:/opt/
[root@master01 k8s]# scp -r /opt/etcd/ root@20.0.0.12:/opt/
[root@master01 k8s]# scp /usr/lib/systemd/system/etcd.service root@20.0.0.11:/usr/lib/systemd/system/
[root@master01 k8s]# scp /usr/lib/systemd/system/etcd.service root@20.0.0.12:/usr/lib/systemd/system/
在node01,02上
[root@node01 ~]# cd /opt/
[root@node01 opt]# ls
[root@node01 opt]# cd etcd/
[root@node01 etcd]# ls
[root@node01 etcd]# yum -y install tree
[root@node01 etcd]# tree /opt/etcd/
[root@node02 ~]# vim /opt/etcd/cfg/etcd
同时node01,02上启动etcd服务
[root@master01 k8s]# bash /root/k8s/etcd.sh etcd01 20.0.0.10 etcd02=https://20.0.0.11:2380,etcd03=https://20.0.0.12:2380
[root@master01 k8s]# systemctl status etcd
[root@node01 etcd]# systemctl start etcd
[root@node01 etcd]# systemctl enable etcd
[root@node01 etcd]# systemctl status etcd
[root@master01 k8s]# cd /opt/etcd/ssl/
[root@master01 ssl]# ls
[root@master01 ssl]# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379" cluster-health
所有node节点部署docker引擎
[root@node02 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@node02 ~]# cd /etc/yum.repos.d/ 设置阿里云镜像源
[root@node02 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docke.repo
如果不是最小化安装环境下,需要安装contain-SElinux包
[root@node02 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@node02 yum.repos.d]# yum clean all 清除缓存
[root@node02 yum.repos.d]# yum makecache 建立缓存
[root@node02 yum.repos.d]# yum install -y docker-ce 安装Docker-CE(社区版Docker引擎)
[root@node02 yum.repos.d]# systemctl start docker 启动服务
[root@node02 yum.repos.d]# systemctl enable docker 自启动
添加镜像加速地址
/etc/docker/daemon.json配置文件中
[root@node02 yum.repos.d]# docker run hello-world
[root@node01 ~]# vim /etc/sysctl.conf
[root@node01 ~]# sysctl -p
[root@node01 ~]# service network restart
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# docker ps -a
[root@node01 ~]# docker images
写入分配的子网段到ETCD中,供flannel使用
[root@master01 ssl]# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
键名 值 技术类型
[root@master01 ssl]# /opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379" get /coreos.com/network/config
[root@node01 ~]# ls
[root@node01 ~]# tar zxvf flannel-v0.10.0-linux-amd64.tar.gz
[root@node01 ~]# mkdir /opt/kubernetes/{
cfg,bin,ssl} -p 创建工作目录
[root@node01 ~]# ls
[root@node01 ~]# cd /opt/kubernetes/
[root@node01 ~]# mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/
[root@node01 /]# ls /opt/kubernetes/bin/
[root@node01 ~]# vim flannel.sh
[root@node01 ~]# bash flannel.sh https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379
[root@node01 ~]# ifconfig
[root@node01 ~]# cat /run/flannel/subnet.env 子网.环境变量
DOCKER_OPT_BIP="--bip=172.17.5.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450" 最大传输单元(默认1500)
DOCKER_NETWORK_OPTIONS=" --bip=172.17.5.1/24 --ip-masq=false --mtu=1450"
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service
添加环境变量文件路径,引用变量
EnvironmentFile=/run/flannel/subnet.env
$DOCKER_NETWORK_OPTIONS
[root@node01 ~]# systemctl daemon-reload
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# ifconfig
[root@node01 ~]# docker images
[root@node01 ~]# docker ps -a
[root@node01 ~]# docker run -it centos:7 /bin/bash
[root@33636c16826a /]# yum -y install net-tools
[root@33636c16826a /]# ifconfig
[root@3e3724b0acf1 /]# ifconfig
[root@3e3724b0acf1 /]# ping 172.17.5.2
在master上操作
生成配置文件,启动脚本
[root@master01 ~]# cd /root/k8s/
[root@master01 k8s]# ls
[root@master01 k8s]# unzip master.zip
[root@master01 k8s]# cd /opt/
[root@master01 opt]# mkdir /opt/kubernetes/{
cfg,bin,ssl} -p
[root@master01 opt]# cd /root/k8s/
[root@master01 k8s]# ls
[root@master01 k8s]# mkdir k8s-cert
[root@master01 k8s]# cd k8s-cert/
[root@master01 k8s-cert]# ls
[root@master01 k8s-cert]# vim k8s-cert.sh
[root@master01 k8s-cert]# bash k8s-cert.sh 生成k8s证书
[root@master01 k8s-cert]# ls
[root@master01 k8s-cert]# ls *.pem
[root@master01 k8s-cert]# cp ca*.pem server*.pem /opt/kubernetes/ssl
[root@master01 k8s-cert]# ls /opt/kubernetes/ssl/
[root@master01 k8s-cert]# cd ..
[root@master01 k8s]# ls
[root@master01 k8s]# tar zxvf kubernetes-server-linux-amd64.tar.gz
[root@master01 k8s]# ls
[root@master01 k8s]# cd kubernetes/
[root@master01 kubernetes]# ls
[root@master01 kubernetes]# cd server/
[root@master01 server]# cd bin/
[root@master01 bin]# ls
[root@master01 bin]# pwd
[root@master01 bin]# pwd
/root/k8s/kubernetes/server/bin
[root@master01 bin]# cp kube-apiserver kube-controller-manager kubectl kube-scheduler /opt/kubernetes/bin (拷贝到master的kubernetes的bin目录下)
[root@master01 bin]# ls /opt/kubernetes/bin
[root@master01 bin]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
0246a531174228b8adfb6ee991861ba6
[root@master01 bin]# vim /opt/kubernetes/cfg/token.csv
添加
0246a531174228b8adfb6ee991861ba6,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
序列号 用户名 id 角色
[root@master01 k8s]# vim apiserver.sh
[root@master01 k8s]# bash apiserver.sh 20.0.0.10 https://20.0.0.10:2379,https://20.0.0.11:2379,https://20.0.0.12:2379
[root@master01 k8s]# systemctl status kube-apiserver.service 查看apiserver服务状态
[root@master01 k8s]# netstat -anpt | grep 6443 监听的https端口
[root@master01 k8s]# netstat -anpt | grep 8080
[root@master01 k8s]# ls
[root@master01 k8s]# vim scheduler.sh 调度器
[root@master01 k8s]# bash scheduler.sh 127.0.0.1
[root@master01 k8s]# systemctl status kube-scheduler.service
[root@master01 k8s]# ps -aux | grep kube 查看进程信息
[root@master01 k8s]# vim controller-manager.sh 控制管理器
[root@master01 k8s]# bash controller-manager.sh 127.0.0.1
[root@master01 k8s]# systemctl status kube-controller-manager.service
[root@master01 k8s]# ps -aux | grep kube 检查进程是否启动成功
[root@master01 k8s]# /opt/kubernetes/bin/kubectl get cs
master上操作
[root@master01 k8s]# cd kubernetes/server/bin/
[root@master01 bin]# ls
[root@master01 bin]# scp kubelet kube-proxy root@20.0.0.11:/opt/kubernetes/bin/
[root@master01 bin]# scp kubelet kube-proxy root@20.0.0.12:/opt/kubernetes/bin/
nod01,02节点操作(复制node.zip到/root目录下再解压)
[root@node01 ~]# cd /root/
[root@node01 ~]# ls
[root@node01 ~]# unzip node.zip 解压node.zip,获得kubelet.sh proxy.sh
[root@node01 ~]# ls
[root@master01 ~]# cd /root/k8s
[root@master01 k8s]# ls
[root@master01 k8s]# mkdir kubeconfig
[root@master01 k8s]# cd kubeconfig/
[root@master01 kubeconfig]# ls
[root@master01 kubeconfig]# mv kubeconfig.sh kubeconfig 拷贝kubeconfig.sh文件进行重命名
[root@master01 kubeconfig]# ls
[root@master01 kubeconfig]# vim kubeconfig
[root@master01 kubeconfig]# cat /opt/kubernetes/cfg/token.csv 获取token信息(验证时使用该令牌认证node节点)
0246a531174228b8adfb6ee991861ba6,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
[root@master01 kubeconfig]# vim kubeconfig
删除前8行配置
# 创建 TLS Bootstrapping Token
#BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
BOOTSTRAP_TOKEN=0fb61c46f8991b718eb38d27b605b008
cat > token.csv <<EOF
${
BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
[root@master01 kubeconfig]# export PATH=$PATH:/opt/kubernetes/bin/
[root@master01 kubeconfig]# echo $PATH
[root@master01 kubeconfig]# kubectl get cs 查看节点状态
[root@master01 kubeconfig]# bash kubeconfig 20.0.0.10 /root/k8s/k8s-cert/
[root@master01 kubeconfig]# ls 查看是否生成为node节点上服务的环境配置文件
[root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@20.0.0.11:/opt/kubernetes/cfg/
[root@master01 kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@20.0.0.12:/opt/kubernetes/cfg/
创建bootstrap角色赋予权限用于连接apiserver请求签名(关键)
集群的用户绑定 角色名
[root@master01 kubeconfig]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
用户名
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created
在node01节点上操作
[root@node01 ~]# cd /opt/kubernetes/cfg/
[root@node01 cfg]# ls
[root@node01 cfg]# cd
[root@node01 ~]# ls
[root@node01 ~]# vim kubelet.sh
[root@node01 ~]# bash kubelet.sh 20.0.0.11
[root@node01 ~]# systemctl status kubelet.service
查看检查到node01节点的请求
[root@master01 kubeconfig]# kubectl get nodes
[root@master01 kubeconfig]# kubectl get csr
[root@master01 kubeconfig]# kubectl certificate approve node-csr-WkcjwO3KckVqSj-2CldkvNZWvx556eyxvEFRnrU7zBc
[root@master01 kubeconfig]# kubectl get csr
Approved,Issued(已经被允许加入群集)
[root@master01 kubeconfig]# kubectl get nodes 查看群集节点,成功加入node01节点
在node01上操作
[root@node01 ~]# ls
[root@node01 ~]# vim proxy.sh
[root@node01 ~]# bash proxy.sh 20.0.0.11
[root@node01 ~]# systemctl status kube-proxy.service
在node01节点操作
[root@node01 ~]# scp -r /opt/kubernetes/ root@20.0.0.12:/opt/
[root@node01 ~]# scp /usr/lib/systemd/system/{
kubelet,kube-proxy}.service root@20.0.0.12:/usr/lib/systemd/system
把kubelet,kube-proxy的service文件拷贝到node2中
在node02上操作,进行修改
[root@node02 ~]# cd /opt/kubernetes/
[root@node02 kubernetes]# ls
bin cfg ssl
[root@node02 kubernetes]# cd ssl/
[root@node02 ssl]# ls
[root@node02 ssl]# rm -rf *
[root@node02 ssl]# ls
[root@node02 ssl]# cd ..
[root@node02 kubernetes]# ls
[root@node02 kubernetes]# cd cfg/
[root@node02 cfg]# ls
[root@node02 cfg]# vim kubelet
[root@node02 cfg]# vim kubelet.config
[root@node02 cfg]# vim kube-proxy
[root@node02 cfg]# systemctl start kubelet.service
[root@node02 cfg]# systemctl status kubelet.service
[root@node02 cfg]# ls /opt/kubernetes/ssl
[root@node02 cfg]# systemctl start kube-proxy.service
[root@node02 cfg]# systemctl status kube-proxy.service
在master上
[root@master01 kubeconfig]# kubectl get csr
[root@master01 kubeconfig]# kubectl certificate approve node-csr-QfLa64BJE8B97Fu7T6Nf5yQUi1ri2J_Qwy10NxPI2m4 授权许可加入群集
[root@master01 kubeconfig]# kubectl get nodes查看群集中的节点
1.master02 构建
2.构建两个nginx负载均衡
先具备单master节点部署环境
添加master02部署
在master01上
[root@master01 ~]# cd /opt/kubernetes/bin/
[root@master01 bin]# ls
[root@master01 bin]# pwd
[root@master01 bin]# vim /etc/profile
[root@master01 bin]# source /etc/profile
[root@master01 bin]# kubectl get node
添加
export PATH=$PATH:/opt/kubernetes/bin/ 环境变量
[root@master01 bin]# scp -r /opt/kubernetes/ root@20.0.0.13:/opt/
[root@master01 bin]# scp /usr/lib/systemd/system/{
kube-apiserver,kube-controller-manager,kube-scheduler}.service root@20.0.0.13:/usr/lib/systemd/system/ 复制master中的三个组件启动脚本kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@localhost ~]# hostnamectl set-hostname master02
[root@localhost ~]# su
关闭防火墙
[root@master02 ~]# systemctl stop firewalld
[root@master02 ~]# setenforce 0
[root@master02 ~]# systemctl status firewalld.service
[root@master02 ~]# cd /opt/
[root@master02 opt]# ls
[root@master02 opt]# cd kubernetes/
[root@master02 kubernetes]# ls
[root@master02 kubernetes]# cd cfg/
[root@master02 cfg]# ls
[root@master02 cfg]# vim kube-apiserver
特别注意:master02一定要有etcd证书
因为master02上有apiserver服务需要与etcd进行数据交互
在master01上
[root@master01 bin]# scp -r /opt/etcd/ root@20.0.0.13:/opt/
[root@master02 cfg]# ls
[root@master02 cfg]# systemctl start kube-apiserver.service
[root@master02 cfg]# systemctl enable kube-apiserver.service
[root@master02 cfg]# ps aux | grep kube
[root@master02 cfg]# systemctl start kube-scheduler.service
[root@master02 cfg]# systemctl enable kube-scheduler.service
[root@master02 cfg]# ps aux | grep kube
[root@master02 cfg]# systemctl start kube-controller-manager.service
[root@master02 cfg]# systemctl enable kube-controller-manager.service
[root@master02 cfg]# vim /etc/profile
[root@master02 cfg]# source /etc/profile
[root@master02 cfg]# kubectl get node
末尾添加
export PATH=$PATH:/opt/kubernetes/bin/
此时master02上也可以查看到node节点信息,原因是master02可以访问master01的etcd的数据信息,无法真正的控制管理两个node节点。
如果使用kubectl get node查看到节点状态不是Ready,检查load balancer的漂移地址是否存在。
[root@node01 ~]# cd /opt/kubernetes/cfg/
[root@node01 cfg]# ls
[root@node01 cfg]# vim kubelet.kubeconfig
重命名
[root@localhost ~]# hostnamectl set-hostname nginx01
[root@localhost ~]# su
[root@server6 ~]# hostnamectl set-hostname nginx02
[root@server6 ~]# su
关闭防火墙
[root@nginx01 ~]# systemctl stop firewalld
[root@nginx01 ~]# setenforce 0
[root@nginx01 ~]# systemctl status NetworkManager
[root@nginx01 ~]# vim /etc/yum.repos.d/nginx.repo
[root@nginx01 ~]# yum clean all 清除缓存
[root@nginx01 ~]# yum makecache 建立缓存
[root@nginx01 ~]# yum list 加载仓库列表
添加
[nginx] 仓库名
name=nginx repo 名称
baseurl=http://nginx.org/packages/centos/7/$basearch/ 官网地址,文件路径
gpgcheck=0 不检查密钥(验证软件版本的序列号,验证软件包是否来自官网)
[root@nginx01 ~]# yum -y install nginx
添加四层转发
[root@nginx01 ~]# vim /etc/nginx/nginx.conf
[root@nginx01 ~]# nginx -t 语法检测
[root@nginx01 ~]# systemctl start nginx
[root@nginx01 ~]# systemctl status nginx
添加
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main; 访问的日志路径
upstream k8s-apiserver {
四层反向代理
server 20.0.0.10:6443; 指向真实ip地址(https)
server 20.0.0.13:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver; 反向代理模块调用模块
}
}
[root@nginx01 ~]# netstat -anpt | grep nginx
6443:反向代理,监听的端口
80:启用nginx服务,默认启用网站,网站提供80端口
[root@nginx01 ~]# yum -y install keepalived
添加 keepalived.conf,nginx.sh
修改配置文件
[root@nginx01 ~]# cp keepalived.conf /etc/keepalived/keepalived.conf 拷贝配置文件
[root@nginx01 ~]# cd /etc/keepalived/
[root@nginx01 keepalived]# ls
检查脚本(vrrp_script)
保证nginx出现问题宕机时,keepalived也同时关闭,使vip地址实现漂移
[root@nginx01 keepalived]# cd /etc/nginx/
[root@nginx01 nginx]# ls
[root@nginx01 nginx]# vim check_nginx.sh
[root@nginx01 nginx]# chmod +x check_nginx.sh
[root@nginx01 nginx]# ls
[root@nginx01 nginx]# systemctl start keepalived.service 启动服务
[root@nginx01 nginx]# systemctl status keepalived.service
添加
count=$(ps -ef |grep nginx |egrep -cv "grep|$$") 反向统计过滤出nginx
查看进程 nginx v:反向统计
if [ "$count" -eq 0 ];then 如果nginx数量为0,
systemctl stop keepalived 则keepalived服务关闭,实现vip地址漂移
fi
[root@nginx01 nginx]# ip a
(nginx01中使用pkill nginx,再在nginx02中使用ip a 查看)
[root@nginx01 nginx]# pkill nginx
[root@nginx01 nginx]# ip a
实现vip地址漂移
因为有check_nginx.sh脚本的存在
[root@nginx01 nginx]# systemctl start nginx
[root@nginx01 nginx]# systemctl status nginx
[root@nginx01 nginx]# systemctl start keepalived.service
[root@nginx01 nginx]# systemctl status keepalived.service
[root@nginx01 nginx]# ip a (vrrp服务有位置抢占功能,优先级高)
在node01,02上
[root@node01 cfg]# vim bootstrap.kubeconfig
[root@node01 cfg]# vim kubelet.kubeconfig
[root@node01 cfg]# vim kube-proxy.kubeconfig
[root@node02 cfg]# systemctl restart kubelet.service
[root@node02 cfg]# systemctl restart kube-proxy.service
[root@node02 cfg]# pwd
[root@node02 cfg]# grep 100 * 替换完成直接自检
[root@nginx01 nginx]# tail /var/log/nginx/k8s-access.log
在master01上操作
[root@master01 ~]# kubectl run nginx --image=nginx
[root@master01 ~]# kubectl get pods 查看状态
[root@master01 ~]# kubectl get pods -w
ContainerCreating 正在创建中
Running 创建完成,运行中
[root@master01 ~]# kubectl get pods -o wide
[root@node01 cfg]# docker ps -a
在master01上
[root@master01 ~]# kubectl describe pod nginx-dbddb74b8-9fbq9 查看创建日志
在master01上
[root@master01 ~]# kubectl get node
解决方式
查看nginx01,02上vip(漂移地址)
[root@nginx01 ~]# systemctl restart keepalived.service
[root@nginx01 ~]# ip a
[root@master01 ~]# kubectl get node
[root@master01 ~]# cd /root/k8s/
[root@master01 k8s]# ls
[root@master01 k8s]# mkdir dashboard
[root@master01 k8s]# ls
拷贝官方的文件
添加文件
dashboard-configmap.yaml :配置文件资源(网站配置文件)
dashboard-rbac.yaml :安全框架(控制用户的权限)
dashboard-service.yaml:提供网站服务(暴露服务)
dashboard-controller.yaml :控制器资源(定义网站有无状态化)
dashboard-secret.yaml :网站的身份验证(网站用户登录的凭据)
k8s-admin.yaml:管理员身份的定义
[root@master01 dashboard]# ls
[root@master01 dashboard]# vim dashboard-rbac.yaml
[root@master01 dashboard]# kubectl create -f dashboard-rbac.yaml
[root@master01 dashboard]# kubectl get role -n kube-system
资源类型 名称
[root@master01 dashboard]# ls
[root@master01 dashboard]# vim dashboard-secret.yaml
[root@master01 dashboard]# kubectl create -f dashboard-secret.yaml
[root@master01 dashboard]# kubectl get secret -n kube-system
[root@master01 dashboard]# ls
[root@master01 dashboard]# vim dashboard-configmap.yaml
[root@master01 dashboard]# kubectl create -f dashboard-configmap.yaml
[root@master01 dashboard]# kubectl get configmap -n kube-system
[root@master01 dashboard]# ls
[root@master01 dashboard]# vim dashboard-controller.yaml
[root@master01 dashboard]# kubectl create -f dashboard-controller.yaml
[root@master01 dashboard]# kubectl get ServiceAccount -n kube-system
[root@master01 dashboard]# ls
[root@master01 dashboard]# vim dashboard-service.yaml
[root@master01 dashboard]# kubectl apply -f dashboard-service.yaml
[root@master01 dashboard]# kubectl get Service -n kube-system
[root@master01 dashboard]# kubectl get pods,svc -n kube-system
[root@master01 dashboard]# kubectl get pods -o wide -n kube-system
-o wide pods:查看创建pod的位置
访问nodeIP就可以访问(火狐浏览器可以直接访问)
https://20.0.0.12:30001
[root@master01 dashboard]# vim dashboard-cert.sh
[root@master01 dashboard]# vim dashboard-controller.yaml
可以识别自签证书
添加两个自签证书
- --tls-key-file=dashboard-key.pem
- --tls-cert-file=dashboard.pem
[root@master01 dashboard]# ls
[root@master01 dashboard]# ls /root/k8s/k8s-cert/
[root@master01 dashboard]# bash dashboard-cert.sh /root/k8s/k8s-cert/
(注意:当apply不生效时,先使用delete清除资源,再apply创建资源)
[root@master01 dashboard]# ls
[root@master01 dashboard]# kubectl apply -f dashboard-controller.yaml (apply更新)
[root@master01 dashboard]# kubectl get pods -o wide -n kube-system
[root@master01 dashboard]# ls
[root@master01 dashboard]# kubectl create -f k8s-admin.yaml
[root@master01 dashboard]# vim k8s-admin.yaml
[root@master01 dashboard]# kubectl get ServiceAccount -n kube-system
[root@master01 dashboard]# kubectl get secret -n kube-system
到此为止,完成k8s的完整性部署完成
1.若干节点设置为污点,意味此节点不会被创建Pod,列入黑名单
2.指定创建,不需要通过调度器,直接创建在指定的节点上
3.docker支持fannel服务
使docker可以应用flannel地址
vim /usr/lib/systemd/system/docker.service
添加环境变量文件路径,引用变量
EnvironmentFile=/run/flannel/subnet.env
$DOCKER_NETWORK_OPTIONS
4.k8s集群中DNS地址为10.0.0.2
5.代理端配置文件
node节点端加k8s集群,要先准备一些材料,身份(配置kubeconfig中),master认证要通过,bootstrap作为访问暴露出去,作为api-server与kubelet之间通信的工具
6.当kubelet启动时会向master发出认证证书请求,master通过,并颁发证书给node节点,node节点才可以加入集群中,由此得出:kubelet决定着node节点是否可以被添加到集群中,如果发送的指令到node,node节点无法执行,说明kubelet出现问题
7.k8s创建资源的方式
1.文件(yaml,json)格式
yaml:pod管理使用(docker-compose编排,适用于自动化管理和编排)
json:k8s开发人员使用开发接口
2.kubectl方式创建