开源的容器化集群管理系统
进行容器化应用部署
利于应用扩展
让部署容器化应用更加简洁和高效
1.自动装箱
2.自我修复:当容器失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供
3.水平扩展
4.服务发现
5.滚动更新
6.版本回退
7.密匙和配置管理
8.存储编排
9.批处理
api server:集群统一入口,以restful风格,交给etcd存储
scheduler:节点调度选择node节点应用部署
controller-manager:处理集群中常规后台任务,一个资源对应一个控制器
etcd:存储系统,用于保存集群相关的数据
kubeelet:master派到node节点代表,管理本机容器
kube-proxy:提供网络代理,实现负载均衡
1.pod:最小的部署单元;一组容器的集合;共享网络;生命周期是短暂的重启服务器会变
2.controller:确保预期pod副本数量;无状态应用部署(没有约定,随便使用);有状态应用部署(依赖存储,网络ip唯一);确保所有的node运行同一个pod;一次性任务和定时任务
3.service:定义一组pod的访问规则
单master集群:master挂掉就不能用了
多master集群:高可用
测试环境:master(2核 4g 20g) node(4核 8g 40g)
1.创建一个master节点, kubeadm init
2.将node节点加入到当前集群 kubeadm join
步骤:
# 关闭防火墙
systemctl stop firewalld systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 /usr/sbin/sestatus -v 查看是否关闭
# 关闭swap
swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 free 查看是否关闭 都是0就是关闭
# 根据规划设置主机名
hostnamectl set-hostname
# 在master添加hosts
cat >> /etc/hosts << EOF 192.168.198.132 k8smaster 192.168.198.131 k8snode1 192.168.198.130 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
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
设置仓库
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine-Community
sudo yum install docker-ce docker-ce-cli containerd.io
镜像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xenbpy66.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
查看docker启动状态
systemctl status docker
开机自动启动docker
sudo systemctl enable docker
配置一下yum的k8s软件源
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
安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
部署Kubernetes Master【master节点】
在master下执行
kubeadm init \ --apiserver-advertise-address=192.168.198.132 \ --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
使用kubectl工具:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看正在运行的节点
kubectl get nodes
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令在node节点执行:
kubeadm join 192.168.198.132:6443 --token 3ve4j2.h1uwpk22ln8fbxmx \ --discovery-token-ca-cert-hash sha256:187fe176e425bebc0ee7e27b5ddb3ff8cae5a61a9dca280f16a0c9b5e308188d
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command
部署CNI网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #查看状态 【kube-system是k8s中的最小单元】 kubectl get pods -n kube-system
测试kubernetes集群
# 下载nginx 【会联网拉取nginx镜像】 kubectl create deployment nginx --image=nginx # 暴露端口 kubectl expose deployment nginx --port=80 --type=NodePort # 查看一下对外的端口 kubectl get pod,svc # 查看状态 kubectl get pod
访问
kubectl [command] [TYPE] [NAME]
command:指定要对资源执行的操作比如create、get、delete
TYPE:指定资源类型,是大小写敏感的,
NAME:指定资源名称,是大小写敏感的,如果省略名称会显示所有的资源
kubectl --help:帮助命令
使用kubectl create命令生成
kubectl create deployment web --image=nginx -o yaml --dry-run > my1.yam
kubectl get命令导出yaml文件
kubectl get deploy nginx -o=yaml --export > my2.yaml
1.最小部署的单元
2.不会直接处理容器,而是Pod,包含多个容器(一组容器的集合)
3.一个Pod中的容器共享网络命名空间
1.创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序
2.Pod是多进程设计,运行多个应用程序 一个Pod有多个容器一个容器里面运行一个应用程序
3.Pod为了亲密性应用:俩个应用之间进行交互、网络之间的调用、俩个应用需要频繁调用
共享网络:
首先创建Paus根容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,可以实现网络的通信
共享存储:
pod持久化数据(Volumes数据卷):日志数据,业务数据等;使用数据卷来进行持久化存储
容器检查
java堆内存溢出进程还在但是不能提供服务
应用层面健康检查
master节点
创建pod先进入到api server进行操作把相关信息存储到etcd中,
scheduler先到api server监听到有没有新的pod创建,通过etcd读取创建的pod根据调度算法分配到某个node节点中返回给api server
node节点
kubelet访问api server读取etcd拿到分配给当前节点的pod通过docker创建容器把这些在状态返回给api server
1.Pod资源限制对Pos调用产生影响:根据request找到足够的node节点进行调度
2.节点选择器标签:
首先要对节点创建标签
kubectl label node k8snode1 env_role=dev
#查看
kubectl get nodes k8snode1 --show-labels
3.节点的亲和性(nodeAffinity)
硬亲和性:约束条件必须满足
软亲和性:尝试满足,不保证
常用操作符:In NotIn Exists Gt Lt DoesNotExists
Taint污点:节点不做普通分配调度,是节点属性
场景:
专用节点
配置特点硬件节点
基于Taint驱逐
(1)查看节点污点情况
kubectl describe node k8smaster | grep Taint
污点值有三个:
NoSchedule:一定不被调度
PreferNoSchedule:尽量不被调度
NoExecute:不会调度并且还会驱逐node已有的的Pod
(2)为节点添加污点
kubectl taint node [node节点名称] key=value:污点三个值
(3)删除污点
kubectl taint node k8snode1 env_role:NoSchedule-node/k8snode1 untainted
Pod是通过controller实现应用的运维比如伸缩,滚动升级等,Pod和controller是通过label,selector标签来建立联系的
deployment应用场景:
部署无状态应用(web服务,微服务),
管理PodheReplicaSet,
部署滚动升级