Kubernetes是什么?
K8s是google开发的专门用来管理docker 容器的平台,为我们 提供可视化界面,方便我们对各个容器进行管理。
基础概念
Master:
Cluster 的大脑,主要职责是调度,可以运行多个 master 来保证高可用。Node:
职责是运行容器应用,Node 由 Master 管理,负责监控并汇报容器的状态, 同时根据 Master 的要求管理容器的生命周期。Pod:
Pod 是 K8s 的最小工作单元。每个 Pod 包含一个或多个容器。Pod 控制器:
K8s 通常不直接创建 Pod,而是通过 Controller 来管理 Pod。Controller 中 定义了 pod 的部署属性,比如几个副本、在什么样的 Node 上运行等。 K8s 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、 StatefuleSet、Job 等。Service:
K8s service 定义了外界访问一组特定 Pod 的方式。service 有 自己的 IP 和端口,service 为 Pod 提供了负载均衡。Namespace:
Namespace 将物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就 是一个 Namespace。不同的 Namespace 里的资源是完全隔离的。
K8s的架构
- Master 节点包含 API Server、Scheduler(调度器)、ControllerManager (控制器管理器)这三个核心的
组件。 - Node 节点包含的核心组件有 Kubelet、Docker 容器引擎、Kube-proxy。
API Server(kube-apiserver)
提供了 HTTP/HTTPS RESTful API,即 Kubernetes API。 API server 是 Kubernetes Cluster 的前端接口。其他客户端工具(CLI 或 UI)以及 K8S 其它组件可以通过它管理 Cluster 资源。
Scheduler(kube-scheduler)
调度器,它负责决定将 Pod 放在哪个 Node 上运行。调度时候考虑 Cluster 拓扑,各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
Controller-Manager
负责监控每一个 Controller(控制器)的健康状态,并确保控制器是健康的。 而控制器是确保 Pod 健康的组件。
etcd
负责保存 K8s Cluster 的配置信息和各种资源的状态信息。当数据发生变化时, etcd 可以快速的通知 K8s 组件。
Kubelet
是 Node 的 agent,当 scheduler 确定在某个 Node 上运行 Pod 后,会将 Pod 的 具体配置信息(image、volume 等)发送给该节点的 kubelet,kubelet 根据 这些信息创建和运行容器,并向 Master 报告运行状态。
Kube-proxy
service 在逻辑上代表了后端的多个 Pod,外界通过 service 访问 Pod。service 接收到的请求是如何转发到 Pod 的呢?这就是 kube-proxy 要完成的工作。每 个 node 都运行 kube-proxy 服务,它负责将访问 service 的 TCP/UDP 数据流转 发到后端容器。如果有多个副本,kube-proxy 实现负载均衡。
K8s集群搭建
重要的事情说三遍!保证Master节点最少2.5G的内存
重要的事情说三遍!保证Master节点最少2.5G的内存
重要的事情说三遍!保证Master节点最少2.5G的内存
1. 安装环境
docker 18.09.9 和 kubelet-1.16.4,要求 centos7.6 以上版本
2. 关闭 selinux
1.查看 selinux 是否关闭
运行指令 getenforce
输出 Enforcing(未关闭)
2.设置临时关闭
setenforce 0
3.永久关闭
vi /etc/sysconfig/selinux
修改 SELINUX=disabled
3. 关闭 swap (交换分区,虚拟内存)
K8s要求安装前必须禁用swap
临时禁用 :swapoff -a
永久禁用:sed -i.bak '/swap/s/^/#/' /etc/fstab ##注释掉/etc/fstab中 swap 那一行
4.配置 ip_forward 转发
ip_forward 配置文件当前内容为 0,表示禁止数据包转发,将其修改为 1 表 示允许
echo "1" > /proc/sys/net/ipv4/ip_forward
5.更新 yum 源
(1)清除掉本地的yum源
cd /etc/yum.repos.d/
rm -rf *
(2)下载centos7的源和docker的源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(3)配置 k8s 源
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
(4)刷新yum源
yum clean all && yum makecache fast
6.安装docker
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
k8s 运行要求 docker 的--cgroup-driver=systemd
启动 docker 并设置开机启动
systemctl enable docker && systemctl start docker
7.安装 k8s 组件
yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
#设置开机启动:
systemctl enable kubelet && systemctl start kubelet
#添加 kubectl 上下文到环境中
echo "source <(kubectl completion bash)" >> ~/.bash_profile
#在home目录中,配置生效
source ~/.bash_profile
8.内核参数修改
-
k8s 网络一般使用 flannel,该网络需要设置内核参数 bridge-nf-call-iptables=1 添加参数配置文件:
执行:
sysctl -p /etc/sysctl.d/k8s.conf
- 内核参数修改失败常见问题
有些系统执行 sysctl -p /etc/sysctl.d/k8s.conf 会报异常,一般是因为 修改这个参数需要系统有 br_netfilter 模块。
使用 lsmod |grep br_netfilter 命令,查看系统里是否有 br_netfilter 模块。
如果没有,则新增 modprobe br_netfilter。
该方式重启后无效。
- 配置系统启动加载脚本使其永久生效
》先加开机启动动作
》再做加载模块动作
》再增加执行权限
至此,已经配置完毕了!
k8s集群搭建
Master节点
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16
执行成功会出现
Your Kubernetes control-plane has initialized successfully! ###这里表示执行成功
To start using your cluster, you need to run the following as a regular user:
###按照下面的步骤,挨个执行,完成初始化
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
### 为K8s配置网络
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
### work节点加入Master的命令
kubeadm join 192.168.31.81:6443 --token ftsxid.akspxn7kwvzh98kk \
--discovery-token-ca-cert-hash sha256:6335d59897e02a10bef22a4a057d88f27f43e0a0239919a20fd0cb8675930ace
根据上面的提示进行操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加 flannel 的网络
kubectl apply -f kube-flannel.yml 该文件需要自己去下载
work节点
执行上面的join命令就可以加入集群了
kubeadm join 192.168.31.81:6443 --token ftsxid.akspxn7kwvzh98kk \
--discovery-token-ca-cert-hash sha256:6335d59897e02a10bef22a4a057d88f27f43e0a0239919a20fd0cb8675930ace
查看集群
kubectl get nodes
OK!一个简单的集群就搭建OK了。