K8s集群

一、k8s简介

Kubernets简称k8s。是用于自动扩展和管理容器化应用程序的开源系统。

中文官网:https://kubernetes.io/zh-cn/

  • 部署方式的进化

在这里插入图片描述

二、创建K8s集群

1、安装vagrant 2.4.0

https://developer.hashicorp.com/vagrant/install?product_intent=vagrant

2、安装 virtualbox7.012

https://www.virtualbox.org/

3、下载 centos7

https://app.vagrantup.com/centos/boxes/7 可新建目录存放

在powershell上运行指令

vagrant box add 本地box存放路径(即下载的centos7镜像) --name 别名
vagrant box list 可查看添加进去的box
vagrant init centos7 初始化box  生成VagrantFile文件
vagrant up 执行创建启动虚拟机
vagrant ssh name(虚拟机名称)  进入虚拟机

VagrantFile 创建三台虚拟机

Vagrant.configure("2") do |config|
    config.vm.define "k8s-node1" do |node|
        # 设置虚拟机的Box
        node.vm.box = "centos/7"
        # 设置虚拟机的主机名
        node.vm.hostname="k8s-node1"
        # 设置虚拟机的IP
        node.vm.network "private_network", ip: "192.168.56.101", netmask: "255.255.255.0"
        node.vm.provider "virtualbox" do |v|
            # 设置虚拟机的名称
            v.name = "k8s-node1"
            # 设置虚拟机的内存大小
            v.memory = 2048
            # 设置虚拟机的CPU个数
            v.cpus = 2
        end
    end

    config.vm.define "k8s-node2" do |node|
        # 设置虚拟机的Box
        node.vm.box = "centos/7"
        # 设置虚拟机的主机名
        node.vm.hostname="k8s-node2"
        # 设置虚拟机的IP
        node.vm.network "private_network", ip: "192.168.56.102", netmask: "255.255.255.0"
        node.vm.provider "virtualbox" do |v|
            # 设置虚拟机的名称
            v.name = "k8s-node2"
            # 设置虚拟机的内存大小
            v.memory = 2048
            # 设置虚拟机的CPU个数
            v.cpus = 2
        end
    end

    config.vm.define "k8s-node3" do |node|
        # 设置虚拟机的Box
        node.vm.box = "centos/7"
        # 设置虚拟机的主机名
        node.vm.hostname="k8s-node3"
        # 设置虚拟机的IP
        node.vm.network "private_network", ip: "192.168.56.103", netmask: "255.255.255.0"
        node.vm.provider "virtualbox" do |v|
            # 设置虚拟机的名称
            v.name = "k8s-node3"
            # 设置虚拟机的内存大小
            v.memory = 2048
            # 设置虚拟机的CPU个数
            v.cpus = 2
        end
    end
end

如果在创建虚拟机过程中遇到

在这里插入图片描述

首先查看ssh配置,如果有ssh配置,且还未解决问题,则在VagrantFile中添加如下配置:

config.ssh.insert_key = false

**注意:**可添加在自己定义的 VagrantFile,也可定义在 .vagrant.d\boxes\centos7\0\virtualbox\ VagrantFile中, 该路径为你添加进的box的路径
添加该配置将不会生成 private_key,则 vagrant ssh k8s-node1 将会报错。
可选择一个一个创建虚拟机。或将vagrant版本降低到2.3.6。

4、环境准备:
Vagrant ssh XXX   例如 :`vagrant ssh k8s-node1` (进入虚拟机)
su root 密码为 vagrant
vi /etc/ssh/sshd_config
修改 PasswordAuthentication yes/no
service sshd restart

为每个虚拟机添加一个NET网卡,如果没有则创建一个。

在这里插入图片描述

修改完配置后,可使用XShell连接 (XShell可下载免费版本)

下载地址:https://www.xshell.com/zh/free-for-home-school/

刷新每个虚拟机的MAC地址。

在这里插入图片描述

5、设置 linux 环境(三个节点都执行)
## 关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
#禁用iptables服务
systemctl stop iptables
systemctl disable iptables
## 关闭 selinux 安全策略:
sed -i 's/enforcing/disabled/' /etc/selinux/config
## 查看selinux 安全策略
cat /etc/selinux/config    可以看到:SELINUX=disabled
## 禁掉当前会话
#setenforce 0
===================================
##关闭 swap 内存交换:
#临时关闭
#swapoff -a 

#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab    
cat /etc/fstab   可以看到:#/swapfile none swap defaults 0 0
free -g  验证,swap 必须为 0=================================
## 添加主机名与 IP 对应关系
vi /etc/hosts
10.0.2.10 k8s-node1
10.0.2.9 k8s-node2
10.0.2.15 k8s-node3
hostnamectl set-hostname <newhostname>:指定新的 hostname(可以不做)
=================================
## 将桥接的 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
=================================
##疑难问题:
##遇见提示是只读的文件系统,运行如下命令
mount -o remount rw /
date 查看时间 (可选)
yum install -y ntpdate
ntpdate time.windows.com 同步最新时间
6、安装docker
## 1 卸载系统之前的 docker 下面是一整句
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

## 2 安装 Docker-CE
## 安装必须的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

## 3 设置 docker repo 的 yum 位置,这个仓库已经被禁用了 代码返回:fastestmirror。
## sudo yum-config-manager \ --add-repo \https://download.docker.com/linux/centos/docker-ce.repo
## 可以使用alibab的仓库来替换	
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 4 安装 docker,以及 docker-cli
sudo yum install -y docker-ce docker-ce-cli containerd.io

## 5 配置 docker 加速 (选做) 这步不要做,会有问题。
## 如果做了导致docker 无法启动记得删除/etc/docker 这个文件加然后重新安装。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

## 6 启动 docker & 设置 docker 开机自启,一定要做这一步
systemctl enable docker
7、配置 ipvs 功能
# 安装ipset和ipvsadm
yum install ipset ipvsadmin -y
# 添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/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
# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 重启
reboot

修改配置文件

修改第10行 ExecStart=
改为	ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

vi /usr/lib/systemd/system/cri-docker.service

# 重载系统守护进程
sudo systemctl daemon-reload
# 设置cri-dockerd自启动
sudo systemctl enable cri-docker.socket cri-docker
# 启动cri-dockerd
sudo systemctl start cri-docker.socket cri-docker
# 检查Docker组件状态
sudo systemctl status docker cir-docker.socket cri-docker
8. 安装Kubernetes(所有节点执行)
#  安装kubectl 当前使用的是最新版本 v1.28.2
# 下载
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 检验
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check
# 安装
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 测试
kubectl version --client
	
# 改国内源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF  
# 安装 不指定版本则是安装最新版本
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
sudo yum install -y install kubeadm kubelet kubectl --disableexcludes=kubernetes
# 设置自启动
sudo systemctl enable --now kubelet

# 下载 runc.amd64  
sudo wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
# 安装
sudo install -m 755 runc.amd64 /usr/local/bin/runc
# 验证
runc -v
9、 部署集群(master节点执行)
# 执行 kubeadm  init 命令
kubeadm init  --node-name=k8s-master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=192.168.255.140 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

# 需要修改的参数
--apiserver-advertise-address # 指定 API 服务器的广告地址、我设置为master节点的ip
	
# 初始化成功后运行下面的命令	
 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

# master节点执行 配置文件的复制(为了在node节点可以使用kubectl相关命令) 
scp /etc/kubernetes/admin.conf 192.168.255.141:/etc/kubernetes/
scp /etc/kubernetes/admin.conf 192.168.255.142:/etc/kubernetes/
10、node节点加入
# 到node节点检查admin.conf文件是否传输完成
ls /etc/kubernetes/
admin.conf  manifests
# 将admin.conf加入环境变量,直接使用永久生效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile
# 加载
source ~/.bash_profile
	
# ---------------------------------加入集群-------------------------------------
# 1.在master节点执行 kubeadm init成功后,会出现 kubeadm join xxx xxx的命令,直接复制到node节点执行就好。
# 2.下面是若没有复制到kubeadm join的命令或者是想要在集群中加入新节点,
#   则先在master执行,获取token 和 discovery-token-ca-cert-hash。
#   获取 token 参数
kubeadm token list   # 查看已有 token
kubeadm token create # 没有token则执行,创建新的 TOKEN
#   获取 discovery-token-ca-cert-hash 参数 
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //'

kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
# 如果上述命令无法执行 或者获取不到 则直接使用下面命令生成 kubeadm join 该语句并执行
kubeadm token create --print-join-command

# 3.node节点执行 kubeadm join
# 修改获取的 token 和 discovery-token-ca-cert-hash 后,再执行
kubeadm join 192.168.255.140:6443 --token y8v2nc.ie2ovh1kxqtgppbo --discovery-token-ca-cert-hash sha256:1fa593d1bc58653afaafc9ca492bde5b8e40e9adef055e8e939d4eb34fb436bf --cri-socket unix:///var/run/cri-dockerd.sock

如果网络抽风 :

# 下载
sudo wget https://github.com/flannel-io/flannel/releases/download/v0.22.3/kube-flannel.yml
# 执行
kubectl apply -f kube-flannel.yml
11、测试kubernetes 集群
kubectl get nodes
kubectl get pod -A	

#如果get nodes 报错 则说明没有添加环境变量 需重新 复制node节点
scp /etc/kubernetes/admin.conf node2节点ip:/etc/kubernetes/
scp /etc/kubernetes/admin.conf node3节点ip:/etc/kubernetes/
# 执行下面的代码加入环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source  ~/.bash_profile
#修改docker的cgroup driver,修改或创建/etc/docker/daemon.json,加入下述内容:
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
# 重新加载
systemctl daemon-reload
systemctl restart docker
docker info | grep Cgroup

STATUS一直为NotReady 首先使用如下命令来看一下kube-system的 pod 状态:

kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide

可以看到 pod kube-flannel 的状态是ImagePullBackoff,意思是镜像拉取失败了,所以我们需要手动去拉取这个镜像。这里可以看到某些 pod 运行了两个副本是因为我有两个节点存在了。

也可以通过kubectl describe pod -n kube-system <服务名>来查看某个服务的详细情况,如果 pod 存在问题的话,你在使用该命令后在输出内容的最下面看到一个[Event]条目,如下:

kubectl describe pod kube-flannel-ds-4j2mp -n kube-system
#手动拉去镜像
docker pull quay.io/coreos/flannel:v0.14.0

修改完了之后过几分钟 k8s 会自动重试,等一下就可以发现不仅flannel正常了,其他的 pod 状态也都变成了Running,这时再看 node 状态就可以发现问题解决了

三、清理

如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。

1)先将节点设置为维护模式(k8s-node1是节点名称)

kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets

2)在删除节点之前,请重置 kubeadm 安装的状态

kubeadm reset

3)重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

4)如果要重置 IPVS 表,则必须运行以下命令:

$ ipvsadm -C

5)现在删除节点:

kubectl delete node k8s-node1

四、k8s部署tomcat

1、拉去tomcat
kubectl create deployment tomcat8 --image=tomcat:8.5.68  通过该执行该命令拉去tomcat并创建副本
2、暴漏端口
kubectl expose deployment tomcat8 --port=80 --target-port=8080 --type=NodePort
3、暴漏端口后不管哪一个节点的ip均可访问,如果无法访问:
kubectl get pod -o wide  查看pod name
kubectl get svc -o wide  查看端口号是否访问正确
kubectl logs pod-name  查看日志是否启动  
# 如果启动成功 则执行以下命令
kubectl exec  tomcat-deploy-b9dd9bbdb-8sdxp -it -- /bin/bash  进入容器
cp -R webapps.dist/. webapps/  将webapps.dist目录下的所有文件移动到webapps下面即可访问
4、删除部署的deployment
kubectl delete deployment.apps/tomcat8
5、删除service
kubectl delete service/tomcat8

五、k8s yml 使用

1、yml模板
apiVersion: v1
kind: pod
metadata:
	name: nginx
	labels:
		name: nginx
spec:
	containers:
	-name: nginx
	 image: nginx
	 ports: 
	 - containerPort: 80
kubectl create deployment tomcat8 --image=tomcat:8.5.68 --dry-run=client -o yaml #该命令可查看创建tomcat8d的yml
kubectl create deployment tomcat8 --image=tomcat:8.5.68 --dry-run=client -o yaml > tomcat8.yaml #在根目录下生成一个tomcat8.yaml文件
kubectl expose deployment tomcat8 --port=80 --target-port=8080 --type=NodePort --dry-run=client -o yaml #暴漏端口yaml

应用yml

kubectl apply -f tomcat8.yaml
2、命令行参考

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

yml文件 可使用 [ — ] 来进行分割 例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tomcat8
  name: tomcat8
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat8
  template:
    metadata:
      labels:
        app: tomcat8
    spec:
      containers:
      - image: tomcat:8.5.68
        name: tomcat
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: tomcat8
  name: tomcat8
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: tomcat8
  type: NodePort
status:
  loadBalancer: {}

六、pod 、service

1、什么是pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。

官方文档链接:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/

七、Ingress

通过Service 发现pod进行关联。基于域名访问。

通过Ingress Controller 实现 Pod 负载均衡。

支持TCP/UDP 4层负载均衡和Http七层负载均衡。

步骤:

1、部署安装

2、配置

八、Kubesphere

1、在 Kubernetes 上最小化安装 KubeSphere

https://kubesphere.io/zh/docs/v3.4/quick-start/minimal-kubesphere-on-k8s/

#执行下列命令快速安装
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration.yaml

九、集群的目标

1、高可用

当一台服务器停止服务后,对于业务用户毫无影响。停止服务的原因可能由于网卡、路由器、机房、cpu过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。

2、突破数据限制

一台服务器不能储存大量数据,需要多台分担,每个储存一部分,共同存储完整的集群数据。最好能做到相互备份,即使单节点故障,也能在其他节点找到故障。

3、数据备份容灾

单点故障后,存储的数据任然可以在别的地方拉起。

4、压力分担

由于多个服务器都能完成各自的一部分工作,所以尽量的避免了单点压力的存在。

十、集群的基本形式

1、主从式

主从复制,同步方式

主从调度,控制方式

2、分片式

数据分片存储,片区之间备份

3、选主式

为了容灾选主,为了调度选主。

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值