kubernetes 是 google 在2014 年开源的一个容器集群管理系统 kuberetes 简述 k8s
k8s 用于容器化应用程序的部署 扩展和管理
k8s 提供来了容器编排 资源调度 弹性伸缩 部署管理 服务发现等一系列功能
kuberetes 目标是让部署容器化应用简单高效 易用
kubernetes 特性
自我修复
在节点故障时重新启动失败容器,替换和重新部署,保证预期的副本数量,杀死健康检查失败的容器,并且在未准备好之间不会处理客户端请求,确保线上服务不中断
弹性伸缩
使用命令,ui或者基于cpu使用情况的=自动快速扩容和缩容应用程序实例,保应用业务高峰并发时的高可用性,业务低峰时回收资源,以最小成本运行服务
自动部署和回滚
k8s采用滚动更新策列更新应用 一次更新一个pod 而不是同时删除所有pod 如果更新过程中出现问题 将回滚更改 确保升级不受影响业务
服务发现和负载均衡
k8s 为多个容器一个统一访问入口 (内部ip地址一个DNS名称)并且负载均衡关联的所有容器 使得用户无需要考虑容器IP问题
机密和配置
管理机密数据和应用程序配置 而不是要把敏感数据暴漏在镜像里,提高敏感数据安全性 并可以将一些常用的配置存储在k8s中 方便应用程序使用
存储编排
挂载外部存储系统 无论是来自本地存储 公有云 (如AWS),还是网络存储(如NFS,glusterFS,Ceph)都是为集群资源的一部分使用,极大提高存储使用灵活性
批处理
提供一次性任务,定时任务,满足批量数据处理的分析的场景
kubernetes 集群架构于组件
kube-apiserver
kube-apiserver API 集群的统一入口 各组件协议调者 以RESTful API 提供接口服务 所有对象资源的增删改查和监听操作都交给 API 处理后提交给 Etcd 存储
kube-conteoller-manager
处理集群中常规后台任务 一个资源对应一个控制器,而controller master 就是负载管理这些控制器的
kube-scheduler
根据调度算法为新创建的pod选择一个node节点 可以任意部署 可以部署在同一个节点上 也可以部署在不同的节点上
etcd
分布式键值存储系统 用于保存集群状态数据,比如pod service 等对象信息
kubelet
kubelet是master在node节点上的Agent 管理本机运行容器的生命周期 比如创建容器 pod挂载数据卷 下载secret 获取容器和节点状等工作,kubelet 将每个pod转换成一组容器
kube-proxy
在node节点上实现pod网络代理 维护网络规则和网络和四层负载均衡工作
docker 19.3.0
容器引擎 运行容器
kubernetes 核心概念
pod
最小部署单元
一组容器的集合
一个pod中的容器共享网络命名空间
pod是短暂的
controllers
replicaSet 确保预期的pod副本数量
deployment 无状态应用部署
statefulSet 有状态应用部署
DaemonSet 确保所有node运行同一个pod
JOB 一次性任务
Cronjob 定时任务
更高级层次对象 部署和管理pod
service
防止pod 失联
定义一组pod的访问策勒
Label 标签 附加到某个资源上 用于关联对象 查询和筛选
Namespace 命令空间 将对象逻辑上隔离
官方提供的三种部署方式
minkube 学习使用的
minkube 是一个工具 可以咋本地快速运行一个单点的kuberetes 仅用于尝试lubenetes或日常开发的用户使用部署 地址 https://kubernetes.is/doce/setup/minkube/
kubeadm 公司测试
kubeadm 也是一个工具 提供kubeadm init 和 kubeadm join 用于快速部署 kubernetes集群
部署地址 https://kubernetes.is/doce/reference/setup-tools/kubeadm/kubeadm
二进制包 生成环境
推荐 从官方下载发行版的二进制包 手动部署每个组件 组成kubernetes集群
下载地址 https://github.com/kubernetes/kubernetes/releases/
实验步骤
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
一台或多台机器,操作系统 CentOS7.x-86_x64;
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多;
集群中所有机器之间网络互通;
可以访问外网,需要拉取镜像;
禁止swap分区。
# 2准备安装环境
## 角色 系统 ip
k8s-master centos.7.3 192.168.10.11
k8s-node1 centos.7.3 192.168.10.12
k8s-node2 centos.7.3 192.168.10.13
# 3 关闭防火墙 seliunx 三个机器都一样执行
## 关闭防火墙:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
关闭selinux:
[root@localhost ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
[root@localhost ~]# setenforce 0# 临时
关闭swap:
[root@localhost ~]# swapoff -a # 临时
[root@localhost ~]# vim /etc/fstab # 永久
#/dev/mapper/centos-swap swap swap defaults 0 0 #禁用就好了
## 根据规划设置主机名:
[root@localhost ~]# hostnamectl set-hostname k8s-maste
在master添加hosts:
[root@k8s-master ~]# cat >>/etc/hosts << EOF
192.168.10.11 k8s-master
192.168.10.12 k8s-node1
192.168.10.13 k8s-node2
EOF
将桥接的IPv4流量传递到iptables的链:
[root@k8s-master ~]# cat >/etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables =1
net.bridge.bridge-nf-call-iptables =1
EOF
[root@k8s-master ~]# sysctl --system # 生效
## 时间同步三台机器都要操作:
[root@k8s-master ~]# yum install ntpdate -y
[root@k8s-master ~]# ntpdate ntp1.aliyun.com
4 安装Docker 三台机器都要安装
[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@k8s-master ~]# yum -y install docker-ce
[root@k8s-master ~]# systemctl enable docker && systemctl start docker
配置镜像下载加速器
[root@k8s-master ~]# cat >/etc/docker/daemon.json << EOF
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
三台操作一样的 我只在 master 操作了
由于版本更新频繁 这里指定了一下 版本号
[root@k8s-master ~]# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
[root@k8s-master ~]# systemctl enable kubelet
#解释和注释
kubelet:systemd守护进程管理
kubeadm:部署工具
kubectl:k8s命令行管理工具
#在 192.168.10.11 master 上执行 要写master ip
[root@k8s-master ~]# kubeadm init \
--apiserver-advertise-address=192.168.10.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
参数解释
–apiserver-advertise-address 集群通告地址
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
–kubernetes-version K8s版本,与上面安装的一致
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 2m v1.18.0
向集群添加新的节点,执行在kubeadm ,init 输出的 kubeadm join 命令
# 这个东西是自己生成的 这个东西是那个界节点加入 在那个机器执行
[root@k8s-node1 ~]# kubeadm join 192.168.10.11:6443--token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
默认token 有效期为24 小时 当过期后 改token 就不可用了 这时就需要重新创建token,操作如下:
[root@k8s-master ~]# kubeadm token create --print-join-command
这里使用Flannel作为Kubernetes容器网络方案,解决容器跨主机网络通信。
Flannel是CoreOS维护的一个网络组件,Flannel为每个Pod提供全局唯一的IP,Flannel使用ETCD来存储Pod子网与Node IP之间的关系。flanneld守护进程在每台主机上运行,并负责维护ETCD信息和路由数据包。
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改国内镜像地址
[root@k8s-master ~]# sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.11.0-amd64#g" kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# kubectl get pods -n kube-system
[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
[root@k8s-master ~]# vim recommended.yaml
...
kind:Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dadashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port:443
targetPort:8443
nodePort: 30006 #添加的端口 30006
selector:
k8s-app: kubernetes-dashboard
type: NodePort 添加的
...
[root@k8s-master ~]# kubectl apply -f recommended.yaml
[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr 1/1 Running 0 13m
kubernetes-dashboard-7f99b75bf4-89cds 1/1 Running 0 13m
访问地址:https://NodeIP:30008
创建service account并绑定默认cluster-admin管理员集群角色
创建用户
[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
[root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
使用输出的Token登入 Dashboard 最后就是
访问地址 192.168.10.11:30006 然后 token 登入就行了