k8s知识点

一、概述

开源的容器化集群管理系统

进行容器化应用部署

利于应用扩展

让部署容器化应用更加简洁和高效

二、功能

1.自动装箱

2.自我修复:当容器失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供

3.水平扩展

4.服务发现

5.滚动更新

6.版本回退

7.密匙和配置管理

8.存储编排

9.批处理

三、集群架构组件(Master(主控节点)和node(工作节点))

master组件 

api server:集群统一入口,以restful风格,交给etcd存储

scheduler:节点调度选择node节点应用部署

controller-manager:处理集群中常规后台任务,一个资源对应一个控制器

etcd:存储系统,用于保存集群相关的数据

node组件

kubeelet:master派到node节点代表,管理本机容器

kube-proxy:提供网络代理,实现负载均衡

四、k8s核心概念

1.pod:最小的部署单元;一组容器的集合;共享网络;生命周期是短暂的重启服务器会变

2.controller:确保预期pod副本数量;无状态应用部署(没有约定,随便使用);有状态应用部署(依赖存储,网络ip唯一);确保所有的node运行同一个pod;一次性任务和定时任务

3.service:定义一组pod的访问规则

五、搭建k8s

搭建k8s环境平台规划:

单master集群:master挂掉就不能用了

k8s知识点_第1张图片

多master集群:高可用

k8s知识点_第2张图片

服务器硬件配置要求

测试环境:master(2核 4g 20g) node(4核 8g 40g)

搭建集群方式:kubeadm,二进制包

kubeadm方式

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

访问

k8s知识点_第3张图片

六、kubernetes 集群命令行工具 kubectl

语法

kubectl [command] [TYPE] [NAME]

command:指定要对资源执行的操作比如create、get、delete

TYPE:指定资源类型,是大小写敏感的,

NAME:指定资源名称,是大小写敏感的,如果省略名称会显示所有的资源

kubectl --help:帮助命令

快速编写yaml文件

使用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

七、Pod

概念

1.最小部署的单元

2.不会直接处理容器,而是Pod,包含多个容器(一组容器的集合)

3.一个Pod中的容器共享网络命名空间

Pod存在的意义

1.创建容器使用docker,一个docker对应一个容器,一个容器有进程,一个容器运行一个应用程序

2.Pod是多进程设计,运行多个应用程序  一个Pod有多个容器一个容器里面运行一个应用程序

3.Pod为了亲密性应用:俩个应用之间进行交互、网络之间的调用、俩个应用需要频繁调用

实现机制

共享网络:

首先创建Paus根容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间中,可以实现网络的通信

共享存储:

pod持久化数据(Volumes数据卷):日志数据,业务数据等;使用数据卷来进行持久化存储

k8s知识点_第4张图片

 镜像拉取策略

k8s知识点_第5张图片

 Pod资源限制

k8s知识点_第6张图片

 Pod重启策略

k8s知识点_第7张图片

 Pod健康检查

容器检查

java堆内存溢出进程还在但是不能提供服务

应用层面健康检查

k8s知识点_第8张图片

 创建流程

master节点

创建pod先进入到api server进行操作把相关信息存储到etcd中,

scheduler先到api server监听到有没有新的pod创建,通过etcd读取创建的pod根据调度算法分配到某个node节点中返回给api server

 node节点

kubelet访问api server读取etcd拿到分配给当前节点的pod通过docker创建容器把这些在状态返回给api server

k8s知识点_第9张图片

影响pod调度的属性

1.Pod资源限制对Pos调用产生影响:根据request找到足够的node节点进行调度

2.节点选择器标签:

首先要对节点创建标签

kubectl label node k8snode1 env_role=dev

#查看
kubectl get nodes k8snode1 --show-labels

k8s知识点_第10张图片

 3.节点的亲和性(nodeAffinity)

硬亲和性:约束条件必须满足

k8s知识点_第11张图片

软亲和性:尝试满足,不保证

k8s知识点_第12张图片

 常用操作符: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

八、controller(在集群上管理和运行容器的对象)

Pod是通过controller实现应用的运维比如伸缩,滚动升级等,Pod和controller是通过label,selector标签来建立联系的

deployment应用场景:

部署无状态应用(web服务,微服务),

管理PodheReplicaSet,

部署滚动升级

你可能感兴趣的:(k8s)