Kubernetes部署
准备工作
准备4台虚拟机:1台主机(带有harbor镜像仓库),1台调度器,2台节点机(因为电脑配置不够所以我主机和调度器用一台)
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
2 CPU 核或更多
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
开启机器上的某些端口。
禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
kubernetes设计架构
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
Kubernetes主要由以下几个核心组件组成:
etcd:保存了整个集群的状态
apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
Kubernetes部署
允许 iptables 检查桥接流量,每个节点同步完成
vim k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system //开启网桥流量
设置免密传输方便我们多次拷贝
ssh-keygen
ssh-copy-id 192.168.1.105
ssh-copy-id 192.168.1.111
把k8s.conf拷贝过去然后sysctl --system运行
关闭节点的selinux和iptables防火墙
setenforce 0 //关闭节点的selinux
iptables -F //关闭iptables防火墙
所有节点部署docker引擎
配置 Docker 守护程序,使用 systemd 来管理容器的 cgroup。然后重启docker
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
查看是否生效
安装 kubeadm、kubelet 和 kubectl
kubeadm:用来初始化集群的指令。
kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl:用来与集群通信的命令行工具
配置下载源,我用阿里的源
cat <<EOF > /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
安装,设置开机自启并且启动
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet
初始化的时候设置网络地址段
kubeadm config print init-defaults //查看默认配置信息
默认从k8s.gcr.io上下载组件镜像,需要FQ才可以,所以需要修改镜像仓库:
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers //列出所需镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers //拉取镜像
上传去镜像仓库
在harbor镜像仓库新建项目
harbor搭建:把https://blog.csdn.net/Ljoker123/article/details/122183389
把harbor的证书拷贝到全部节点
scp -r certs.d/ 192.168.1.105:/etc/docker/
scp -r certs.d/ 192.168.1.111:/etc/docker/
然后调度器登录仓库
docker login reg.westos.org
过滤一下信息改一下名称
docker images | grep ^registry | awk '{print $1":"$2}' | awk -F/ '{system("docker tag "$0" reg.westos.org/k8s/"$3"")}'
上传仓库
docker images | grep k8s | awk '{system("docker push "$1":"$2"")}'
k8s集群初始化
kubeadm config images list --image-repository reg.westos.org/k8s //列出镜像这次指向自己的镜像仓库
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/k8s //初始化集群
两种方式操作集群
普通用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
超级用户
export KUBECONFIG=/etc/kubernetes/admin.conf
节点扩容:
kubeadm join 192.168.1.107:6443 --token 09shla.6wftfyhwtl1s5aq2 --discovery-token-ca-cert-hash sha256:ef9ff779f53e665a24920ce6ea4d06ef860b3d886a80087a338ce0895c2c4ab1
写到用户文件里面开机自动启动
[root@ljb2 ~]# vim .bash_profile
查看一下还有网络插件没有安装
下载flannel网络组件(如果下载报错说证书不可用yum install ca-certificates -y)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
vim kube-flannel.yml
docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0 //拉取镜像
docker tag rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0 reg.westos.org/k8s/mirrored-flannelcni-flannel-cni-plugin:v1.0.0 //改名
docker push reg.westos.org/k8s/mirrored-flannelcni-flannel-cni-plugin:v1.0.0 //上传到仓库
docker pull quay.io/coreos/flannel:v0.15.1 //拉取镜像
docker tag quay.io/coreos/flannel:v0.15.1 reg.westos.org/k8s/flannel:v0.15.1 //改名
docker push reg.westos.org/k8s/flannel:v0.15.1 //上传到仓库
修改下载的网络插件配置文件(下载指向自己的仓库)
安装flannel网络组件查看状态
kubectl apply -f kube-flannel.yml
其他节点加入主节点
查看是否成功
Pod管理
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
创建Pod应用
kubectl run nginx --image=nginx --replicas=2 --record
集群内部任意节点可以访问Pod,但集群外部无法直接访问。
删除Pod
# kubectl delete pod nginx-6db489d4b7-2v97v
由于--replicas=2,集群会自动创建Pod。
# kubectl delete deployment nginx //彻底删除
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。
创建service
kubectl expose deployment nginx --port=80 --target-port=80
此时pod客户端可以通过service的名称访问后端的两个Pod
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
使用NodePort类型暴露端口,让外部客户端访问Pod
kubectl edit svc nginx //修改service的type为NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort //也可以在创建service时指定类型
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
Pod扩容与缩容
kubectl scale --replicas=6 deployment nginx
kubectl scale --replicas=3 deployment nginx
更新pod镜像
kubectl set image deployment nginx nginx=nginx:1.16.0 --record
回滚:
kubectl rollout history deployment nginx //查看历史版本
kubectl rollout undo deployment nginx --to-revision=1 //回滚版本
————————————————
版权声明:本文为CSDN博主「ZzzLJokerB」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Ljoker123/article/details/122295576

浙公网安备 33010602011771号