节点
Masker:集群控制节点,每个集群至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行再pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等
Service:pod对外服务的统一入口,下面可以维护着同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
核心组件
Kubernetes 主要由以下几个核心组件组成:
etcd 保存了整个集群的状态;
apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和
发现等机制;
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新
等;
scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管
理;
Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
创建Pod清单 --> API Server
API Server --> etcd
etcd --> API Server
kube-scheduler --> API Server --> etcd
etcd --> API server --> kubelet --> Docker
kubelet --> API Server --> etcd
管理员清单提交给了 APIServer;
API Server 接收到请求后把资源清单信息存入到etcd数据库中;
etcd存好后跟新状态给API Server;
API Server通过相应的接口跟新事件;
kube-scheduler 组件发现这个时候有一个Pod还没有绑定到节点上,就会对这个Pod进行一系列的调度,把它调度到一个最合适的节点上;
然后把这个节点和Pod绑定到一起的信息告诉API Server;
API Server将调度消息跟新到etcd里,etcd更新好后返回状态给API Server;
节点上的kubelet组件这个时候watch到有一个Pod被分配过来了,就去把这个Pod的信息拉取下来,然后根据
描述通过容器运行时把容器创建出来,最后当然同样把Pod状态汇报给API Server 再写回到etcd中去,这样就
完成了一整个的创建流程。
Pod
pod时k8s的最小单位
pod的ip地址是随机的,删除pod会改变ip
pod都有一个根容器
一个pod内可以由一个或多个容器组成
一个pod内的容器共享根容器的网络命名空间和文件系统卷
一个pod的内的网络地址由根容器提供
Pod运行状态
Pending 等待中
Running 运行中
Succeeded 正常终止
Failed 异常停止
Unkonwn 未知状态
Label
label标签是kubernetes中非常重要的一个属性,label标签就像身份证一样,可以用来识别k8s的对象
我们在传统架构里不同组件之间查找都是通过ip地址,但是k8s里,很多匹配关系都是通过标签来查找
Namespace
Namespace(命名空间)是k8s里另一个非常重要的概念,Namespace通过集群内部的资源对象划分为不同的。
Namespace里,形成逻辑上的不同项目组或用户组
常见的pod,service,Deployment等资源如果没有指定命名空间,则默认创建在名为default的默认命名空间
Controoler
用来管理Pod,控制器的种类有很多
- RC Replication Controller #控制Pod有多个副本
- RS replicaSet #RC控制的升级版
- Deployment #推荐使用,功能更强大,包含了RS控制器
- DaemonSet #保证所有的Node上有且只有一个Pod在运行
- StatefulSet #有状态应用,为Pod提供唯一标识,它可以保证部署和scale的顺序
Kubernetes部署
1.二进制安装 (生产推荐)
2.kubeadm安装 学习和实验
3.第三方安装工具比如rancher
4.云服务的k8s,比如阿里云的ACK
kubeadm安装准备 #除了hosts其他所有节点配置
关闭防火墙
关闭selinux
配置hosts解析
关闭swap分区 sed -i '/swap/d' /etc/fstab
关闭selinux sed -i 's/enforcing/disabled/g' /etc/selinux/config
系统环境准备
设置k8s禁止使用swap
cat > /etc/sysconfig/kubelet << EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" #驱动改为systemd驱动
KUBELET_EXTRA_ARGS="--fail-swap-on=false" #忽略swap分区报错
EOF
设置时间同步
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
配置hosts文件
cat >> /etc/hosts << EOF
192.168.211.100 master
192.168.211.110 node1
192.168.211.120 node2
EOF
设置内核参数将ipv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
加载IPVS模块
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv
安装配置docker #切记匹配K8s版本
配置阿里源
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
安装指定版本docker
yum list docker-ce --showduplicates
yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15
配置docker镜像加速和cgroup驱动
mkdir /etc/docker -p
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://01xxgaft.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
启动docker并设置开机自启
systemctl enable docker && systemctl start docker
添加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
安装
master:kube-apiserver、scheduler、etcd
node:kubelet、kube-proxy
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm
systemctl start kubelet
systemctl enable kubelet
初始化集群命令只在master节点运行
kubeadm init \
--apiserver-advertise-address=192.168.211.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.3 \
--service-cidr=192.1.0.0/16 \
--pod-network-cidr=192.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
为kubectl准备kubeconfig #管理k8s集群的凭证文件
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
设置kube-proxy使用ipvs模式,将mode修改为ipvs
kubectl edit cm kube-proxy -n kube-system
重启kube-proxy
kubectl delete pods -n kube-system -l k8s-app=kube-proxy
查看pod信息
kubectl get pods -n kube-system -l k8s-app=kube-proxy
查看日志
kubectl logs -f kube-proxy-pg99x -n kube-system
检查ipvs规则
ipvsadm -Ln
将node节点加入master
kubeadm join 192.168.211.100:6443 --token cvdzgw.qlrm2jqa15eexs78 \
--discovery-token-ca-cert-hash sha256:253dc3197f2aee043d962d4268031fd22e7dd65831b9793eda6ea86a653bedb4
#kubeadm init 作用:检查环境与拉取镜像
#1.[preflight]环境检查和拉取镜像 kubeadm config images pull
#2.[certs]生成k8s证书和etcd证书 /etc/kubernetes/pki
#3.[kubeconfig] 生成kubeconfig文件
#4.[kubelet-start]生成kubelet配置文件
#5.[control-plane]部署管理节点组件,用镜像启动容器 lubectl get pods -n kube-system
#6.[etcd]部署etcd数据库,用镜像启动容器
#7.[upload-config] [kubelet] [upload-certs] 上传配置文件到k8s中
#8.[mark-control-plane]给管理节点添加一个标签 node-role.kubernetes.io/master='',node-role.kubernetes.io/master:NoSchedule]
#9.[bootstrap-token]自动为kubelet颁发证书
#10.[addons]部署插件,CoreDNS、kube-proxy
#部署完成执行,拷贝连接k8s集群认证文件到默认路径下
#mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
#node节点
#kubeadm join 192.168.211.100:6443 --token hovwan.76ci92culx3r43t7
# --discovery-token-ca-cert-hash sha256:7de25c6275c858fce1e79f30d492e2a1af1ae90518a81b6eab7d7bb27dacd1c8
#遇到了两次报错分别通过将master的/etc/kubernetes/admin.conf文件复制到node对应目录
#使用kubeadmin reset清空配置
#网络插件
#wget https://docs.projectcalico.org/manifests/calico.yaml
部署flannel网络插件master执行
git clone --depth 1 https://github.com/coreos/flannel.git
##修改配置文件将128行替换为podip,180行新增加一行指定网卡名
cd flannel/Documentation/
vim kube-falannel.yml
128 "Network": "192.1.0.0/16"
189 - --iface=ens33
kubectl apply -f kube-flannel.yml
给节点打标签
kubectl label nodes node1 node-role.kubernetes.io/node=
kubectl label nodes node2 node-role.kubernetes.io/node=
支持命令补全
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash >/etc/bash_completion.d/kubectl