一、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、选主式
为了容灾选主,为了调度选主。