文章目录
一、k8s介绍
1.k8s是什么?
在Docker作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。
Kubernetes是Google于2014年创建管理的,是Google10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。可以说Kubernetes是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。
Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。
2.k8s的优点
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
3.k8s的设计架构
k8s集群由Master节点和Node(Worker)节点组成。
Master节点:指的是集群控制节点,管理和控制整个集群,基本上k8s的所有控制命令都发给它,它负责具体的执行过程。
在Master上主要运行着:
Kubernetes Controller Manager(kube-controller-manager):k8s中所有资源对象的自动化控制中心,维护管理集群的状态,比如故障检测,自动扩展,滚动更新等。
Kubernetes Scheduler(kube-scheduler): 负责资源调度,按照预定的调度策略将Pod调度到相应的机器上。
etcd:保存整个集群的状态。
Node节点:除了master以外的节点被称为Node节点或者Worker节点,可以在master中使用命令 kubectl get nodes
查看集群中的Node节点。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,该节点上的工作负载就会被Master自动转移到其它节点上。
在Node上主要运行着:
kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能。
kube-proxy:实现service的通信与负载均衡
docker(Docker Engine):Docker引擎,负责本机的容器创建和管理。
4.k8s的核心组件集中解释
etcd:保存了整个集群的状态
apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理。
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)。
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
5.还有一些推荐的Addons
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外网入口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可用区的集群
Fluentd-elasticsearch:提供集群日志采集、存储与查询
Kubernetes设计理念和功能: 其实就是一个类似Linux的分层架构
核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境。
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)。
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)。
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴。
Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等。
Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等。
二、k8s部署
安装步骤
1.关闭所有节点的selinux和iptables防火墙
2.所有节点部署docker引擎
yum install -y docker-ce docker-ce-cli
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system
systemctl enable docker
systemctl start docker
编辑所有节点 vim /etc/docker/daemon.json
调整docker启动参数(主要是把Cgroup驱动换成systemd驱动获得稳定的运行环境)
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker
3.禁用swap分区
swapoff -a
vim /etc/fstab #注释掉/etc/fstab文件中的swap那行
4.安装部署软件kubeadm
首先配置一个k8s的阿里云源
vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
安装工具
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet
5.列出所需镜像
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
6.拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
7.初始化集群(在master上做)
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
#--pod-network-cidr=10.244.0.0/16 使用flannel网络组件时必须添加
#--kubernetes-version 指定k8s安装版本
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
如果所使用的用户不是root而是kubeadm的话初始化集群之后进行如下操作:
useradd kubeadm
vim /etc/sudoers
kubeadm ALL=(ALL) NOPASSWD: ALL
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
8.配置kubectl命令补齐功能
echo "source <(kubectl completion bash)" >> ~/.bashrc
9.安装flannel网络组件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
10.将node节点加入集群(此命令可以在master节点上找到)
kubeadm join --token b3a32e.7cef20447b55261e 172.25.0.11:6443 --discovery-token-ca-cert-hash sha256:bc718df41fdceb0db6c5380c7e27c204589b41dcb5f9a3bc52c254b707377f2f
11.在master节点上查看
kubectl get cs
kubectl get node
kubectl get pod -n kube-system
三、k8s部署实验截图
server1、server2和server3均做
server1、server2和server3做相同的操作。
禁用交换分区,server1、server2和server3做如下操作。
将repo文件拷贝到node节点
安装工具
设置kubelet开机自启
查看默认配置
预先拉取镜像,这里报错了。
重新下载
查看下载的镜像
在master节点进行初始化操作
新建用户
安装网络组件
将node节点加入集群(这一步在node节点上执行)
下图仅展示了server3节点
发现cs出现unhealthy的问题
四、解决报错
将master节点两个配置文件的port=0注释掉
重新获取节点发现正常
接下来检查server1、server2和server3的防火墙、selinux等。重新加入集群
成功
五、补充
注意:将master的内存调大一点,免得出现如下问题。
调大之后正常了
当删除一个pod,它会立马重建。
要删除的话直接删除deployment控制器
扩容与缩容
更新镜像
查看记录并回滚
设置暴露端口
实现了负载均衡
删除svc