重要的概念
搭建之前我们先理解几个概念:
Cluster
Cluster 是计算,网络,存储资源的集合。
Master
Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行,为了实现高可用,可以运行多个Master。
Node
Node 的职责是运行容器的应用,Node 由 Master 管理,Node 负责监控并汇报容器的状态,同时根据Master 的要求管理容器的生命周期。
Pod
Pod 是 k8s 的最小工作单元,每个Pod包含了一个或多个容器,Pod 中的容器会作为一个整体备 Master 调度到一个Node上运行。
- 为什么引入Pod ?
Controller
Service
Namespace
部署k8s
计划部署3节点的k8s cluster,部署模型如图:
image.pngviros1 作为 master,viros2 和 viros3 作为剩下的节点。
安装docker
所有节点上都需要安装docker。这里参见:docker-ce 的安装与卸载
注意,安装完成后,还需要,修改docker-ce默认配置为systemd,以及修改为国内官方镜像源。
# cat > /etc/docker/daemon.json << EOF
{
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
EOF
# systemctl restart docker
一些配置
所有节点,需要执行:
-
设置3个节点/etc/hosts,以及ssh免密登录
参考:https://www.jianshu.com/p/791cc53d7951 -
关闭SELINUX
参考:https://www.jianshu.com/p/791cc53d7951 -
关闭swap分区
参考:https://www.jianshu.com/p/5c039215992a -
启用网桥过滤模块
# modprobe br_netfilter
查看是否加载成功:
image.png# lsmod | grep br_netfilter
为什么要启用br_netfilter,参考:k8s中为什么需要br_netfilter与net.bridge.bridge-nf-call-iptables=1
-
加载ipvs等模块
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块。- 安装ipset和ipvsadm
# yum install ipset ipvsadm -y
- 添加需要加载的模块写入脚本文件
查看模块是否加载:# cat > /etc/sysconfig/modules/ipvs.modules <<EOF modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # /bin/bash /etc/sysconfig/modules/ipvs.modules
image.png# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 安装ipset和ipvsadm
-
调整内核参数
# cat > /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 # 开启ip转发 net.ipv4.tcp_tw_recycle=0 # 关闭快速回收处于TIME_WAIT状态的socket net.ipv6.conf.all.disable_ipv6=1 # 禁用ipv6 vm.swappiness=0 # 禁止使用 swap 空间, 只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 内存不足时, 启动 OOM killer EOF # sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
和net.bridge.bridge-nf-call-ip6tables=1
参考:k8s 中为什么要开启bridge-nf-call-iptables
添加ali k8s repo 源
# cat <<EOF > /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
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
# yum makecache
安装kubelet,kubeadm ,kubectl
kubelet 运行在cluster所有节点上,负责启动Pod和容器,kubeadm 用于初始化 cluster,kubectl 是 k8s 的命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新各种组件。
# yum install kubelet kubeadm kubectl
# systemctl enable kubelet
用 kubeadm 创建 cluster
如果想重新初始化则执行:kubeadm reset
下面开始初始化cluster:
kubeadm init \
--apiserver-advertise-address=192.168.48.20
--image-repository registry.aliyuncs.com/google_containers
遇到报错:
image.png
然后参考:https://www.cnblogs.com/xlei/p/16999271.html 执行命令解决:
# rm -rf /etc/containerd/config.toml
# systemctl restart containerd
继续报错:
image.png
这是因为国内连接不上registry.k8s.io,因为我有proxy,所以修改 /usr/lib/systemd/system/containerd.service ,加上proxy:
[Service]
Environment="http_proxy=http://192.168.48.1:7890"
Environment="https_proxy=http://192.168.48.1:7890"
...
image.png
再执行:systemctl daemon-reload && systemctl restart containerd
。
kubeadm init 之后:
image.png
master 节点编辑/etc/profile,加入:
export KUBECONFIG=/etc/kubernetes/admin.conf
再执行source /etc/profile
再再俩从节点上执行:
kubeadm join 192.168.48.20:6443 --token o5t82v.8zvsvsc273meng2y \
--discovery-token-ca-cert-hash sha256:7192b77a8696565ace34a6d6a8f03303d1debafe70d543529af899fab6c52138
如果不小心清屏,那么可以再执行 kubeadm token create --print-join-command
查看token。
此时,我们3个节点集群已经初步ok,再master节点上执行kubectl get nodes
,可以查看:
master 节点配置网络,使用Calico
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
编辑 calico.yaml 文件,如图所示,新增加:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
image.png
ens33 为 192.168.48.20 所在的网卡
执行:
# kubectl apply -f calico.yaml
部署的时候calico 一直报奇奇怪怪的错误,好像是去连接了代理去通信,把上面步骤 /usr/lib/systemd/system/containerd.service 中加入的proxy注释掉后,calico 安装成功。
image.png
k8s contaired docker 之前的关系
查看node上的所使用的container runtime:
image.png
我这里安装的k8s 是v1.28.4 版本,已经将容器运行时改为 contaired(不是docker),所以这么多pod在运行,我输入 docker ps 却看不到一个在运行的容器,那么怎么查看contaired上运行的容器呢?
# crictl config runtime-endpoint unix:///run/containerd/containerd.sock
# crictl ps
image.png
所以,再回来审视我们的安装步骤,理论上来说已经不需要安装docker了,而是需要安装 contaired,但是安装docker 好像会安装上contaired。
关于 k8s docker contaired 关系可以查看:https://zhuanlan.zhihu.com/p/494054143
运行一个demo
创建Namespace:
# cat > ns-nginx.yml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: nginx
labels:
name: nginx
EOF
# kubectl create -f ns-nginx.yml
查看刚才创建的命名空间:
# kubectl get namespaces
image.png
部署nginx 应用
# cat > nginx.yml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment1
namespace: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-demo
image: nginx:1.14.0
ports:
- containerPort: 80
EOF
# kubectl create -f nginx.yml
查看 namesapce 为nginx 下的 pods
# kubectl get pods -n nginx
image.png
查看我们定义的deployment
# kubectl get deployment -n nginx
image.png
在上面我们定义了2个副本,执行如下命令课查看pod分别被调度到了哪些节点上。
kubectl get pods -n nginx -o wide
image.png
卸载k8s
TODO
k8s 架构组成简介
参考资料
1、https://learnku.com/docs/go-micro-build/1.0/kubernetes-1804-cluster-installation-tutorial-based-on-centos7/8877
2、https://www.cnblogs.com/Fzeng/p/17288286.html
3、http://123.57.207.179/article_detail/1646098660465628
4、https://blog.csdn.net/axibazZ/article/details/119301373
网友评论