K8S学习笔记
- 一、Kubernetes
- 1.1、K8S功能
- 1.2、K8S架构组件
- 1.2.1、架构细节
- 1.3、K8S核心概念
- 1.3.1、Pod
- 1.3.2、Volume
- 1.3.3、Controller
- 1.3.4、Deployment
- 1.3.5、Service
- 1.3.6、Label
- 1.3.7、Namespace
- 1.3.8、API
- 二、搭建K8S
- 2.1、K8S搭建规划
- 2.1.1、单master集群
- 2.1.2、多master集群
- 2.2、kubeadm方式安装
- 2.2.1、系统初始化
- 2.2.2、安装K8S
- 2.2.2.1、安装 Docker
- 2.2.2.2、安装 kubeadm,kubelet 和 kubectl
- 2.2.2.2、部署 Kubernetes Mast
- 2.2.2.3、安装 Pod 网络插件(CNI)
- 2.2.2.4、测试 kubernetes
一、Kubernetes
kubernetes,简称K8s,是用8 代替8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 积累了作为Google 生产环境运行工作负载15 年的经验,并吸收了来自于社区的最佳想法和实践。
1.1、K8S功能
- 自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
- 自我修复(自愈能力):
当容器失败时,会对容器进行重启
当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
如果某个服务器上的应用不响应了,Kubernetes会自动在其它的地方创建一个 - 水平扩展:通过简单的命令、用户UI 界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
当我们有大量的请求来临时,我们可以增加副本数量,从而达到水平扩展的效果 - 服务发现:用户不需使用额外的服务发现机制,就能够基于Kubernetes 自身能力实现服务发现和负载均衡
对外提供统一的入口,让它来做节点的调度和负载均衡, 相当于微服务里面的网关 - 滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
添加应用的时候,不是加进去就马上可以进行使用,而是需要判断这个添加进去的应用是否能够正常使用 - 版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
- 密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
- 存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务 - 批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景
1.2、K8S架构组件
1.2.1、架构细节
K8S架构主要包含两部分:Master(主控节点)和 node(工作节点)
K8S集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
master:主控节点
- API Server:集群统一入口,以restful风格进行操作,同时交给etcd存储
- 提供认证、授权、访问控制、API注册和发现等机制
- scheduler:节点的调度,选择node节点应用部署
- controller-manager:处理集群中常规后台任务,一个资源对应一个控制器
- etcd:存储系统,用于保存集群中的相关数据
Work node:工作节点
-
Kubelet:master派到node节点代表,管理本机容器
- 一个集群中每个节点上运行的代理,它保证容器都运行在Pod中
- 负责维护容器的生命周期,同时也负责Volume(CSI) 和 网络(CNI)的管理
-
kube-proxy:提供网络代理,负载均衡等操作
-
容器运行环境【Container Runtime】
- 容器运行环境是负责运行容器的软件
- Kubernetes支持多个容器运行环境:Docker、containerd、cri-o、rktlet以及任何实现Kubernetes CRI (容器运行环境接口) 的软件。
-
fluentd:是一个守护进程,它有助于提升 集群层面日志
1.3、K8S核心概念
1.3.1、Pod
- Pod是K8s中最小的单元
- 一组容器的集合
- 共享网络【一个Pod中的所有容器共享同一网络】
- 生命周期是短暂的(服务器重启后,就找不到了)
1.3.2、Volume
- 声明在Pod容器中可访问的文件目录
- 可以被挂载到Pod中一个或多个容器指定路径下
- 支持多种后端存储抽象【本地存储、分布式存储、云存储】
1.3.3、Controller
- 确保预期的pod副本数量【ReplicaSet】
- 无状态应用部署【Deployment】
- 无状态就是指,不需要依赖于网络或者ip
- 有状态应用部署【StatefulSet】
- 有状态需要特定的条件
- 确保所有的node运行同一个pod 【DaemonSet】
- 一次性任务和定时任务【Job和CronJob】
1.3.4、Deployment
- 定义一组Pod副本数目,版本等
- 通过控制器【Controller】维持Pod数目【自动回复失败的Pod】
- 通过控制器以指定的策略控制版本【滚动升级、回滚等】
1.3.5、Service
- 定义一组pod的访问规则
- Pod的负载均衡,提供一个或多个Pod的稳定访问地址
- 支持多种方式【ClusterIP、NodePort、LoadBalancer】
1.3.6、Label
label:标签,用于对象资源查询,筛选
1.3.7、Namespace
命名空间,逻辑隔离
- 一个集群内部的逻辑隔离机制【鉴权、资源】
- 每个资源都属于一个namespace
- 同一个namespace所有资源不能重复
- 不同namespace可以资源名重复
1.3.8、API
我们通过Kubernetes的API来操作整个集群
同时我们可以通过 kubectl 、ui、curl 最终发送 http + json/yaml 方式的请求给API Server,然后控制整个K8S集群,K8S中所有的资源对象都可以采用 yaml 或 json 格式的文件定义或描述
如下:使用yaml部署一个nginx的pod
二、搭建K8S
2.1、K8S搭建规划
2.1.1、单master集群
2.1.2、多master集群
2.2、kubeadm方式安装
2.2.1、系统初始化
关闭防火墙:
systemctl stop firewalld #临时
systemctl disable firewalld # 永久
关闭 selinux
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config # 永久【重启生效】
setenforce 0 # 临时
关闭 swap:
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久【重启生效】
在== master ==添加 hosts:
cat >> /etc/hosts << EOF
192.168.60.151 k8smaster
192.168.60.152 k8snode1
192.168.60.153 k8snode2
EOF
将桥接的 IPv4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
时间同步:
yum install ntpdate -y
ntpdate time.windows.com
2.2.2、安装K8S
2.2.2.1、安装 Docker
所有节点安装
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker
#阿里云的yum源
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
#安装 docker
yum -y install docker-ce-18.06.1.ce-3.el7
#设置docker开机自启与启动docker
systemctl enable docker && systemctl start docker
# 查看 docker 版本
docker --version
docker 添加阿里云 YUM 软件源
cat >> /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
2.2.2.2、安装 kubeadm,kubelet 和 kubectl
所有节点安装
添加 yum
# 配置 k8s 的 yum 源【阿里云】
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
# 安装 kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机自启【这里暂时先不启动 kubelet】
systemctl enable kubelet
2.2.2.2、部署 Kubernetes Mast
Master上执行
kubeadm init --apiserver-advertise-address=192.168.3.34 --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
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
安装成功会提示kubeadm 指令(每个人不一样),先复制下来到Node结点执行
kubeadm join 192.168.3.34:6443 --token jt1gaq.tvjxyy6bdbr70r95 \
--discovery-token-ca-cert-hash sha256:68e7c5f64b6e15efe25421a17af0057d013e1f40f55138cb637552449e378be9
#默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:
Master上执行使用 kubectl 工具:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Master上执行查看Node结点是否加进来
kubectl get node
2.2.2.3、安装 Pod 网络插件(CNI)
raw.githubusercontent.com的地址被污染先去ip查询查询ip
然后在hosts里添加185.199.108.xxx raw.githubusercontent.com
# 下载网络插件配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 添加
kubectl apply -f kube-flannel.yml
# 等一会!
# ......
# 查看状态 【kube-system 是 k8s 中的最小单元】
kubectl get pods -n kube-system
嫌麻烦也有我自己下载好久才成功的配置
配置文件
2.2.2.4、测试 kubernetes
在 Kubernetes 集群中创建一个 pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
如果我们出现 Running 状态的时候,表示已经成功运行了
需要将端口暴露出去,让其它外界能够访问
#暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看一下对外的端口
kubectl get pod,svc
访问地址:http://NodeIP:Port
eg:http://192.168.3.34:32698/