通过命令为每一个服务器设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
free -m # 查看分区,需要将SWap全部改成0
# 关闭swap
swapoff -a
sed -ri 's/.*swap.*'/#&/' /etc/fstab
# 将SELinux设置为permissive模式(相当于将其禁用)
sudo setenforce 0 # 临时禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive' /etc/selinux/config # 永久禁用
# 允许iptables检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 让以上配置生效
sudo sysctl --system
二、为三台服务器安装docker
# 移除以前的docker相关包
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker -latest-logrotate
docker-logrotate docker-engine
# 配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动
systemctl enable docker --now
三、为每台服务器安装kubelet/kubeadm/kubectl
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=0
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
sudo yum install -y kebelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
四、使用kubeadm引导集群
# 下载各个机器需要的镜像
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images/sh && ./images.sh
在三台服务器的集群中确认主节点
# 所有节点都需要添加master映射
echo "172.31.0.2" cluster-endpoint >> /etc/hosts
# 使得三个服务器都能通过ping 成功
ping cluster-endpoint
初始化主节点(只在主节点中单独运行)
# 主节点初始化(只在主节点运行)
kubeadm init
--apiserver-advertise-address=172.31.0.2
--control-plane-endpoint=cluster-endpoint
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images
--kubernetes-version v1.20.9
--service-cidr=10.96.0.0/16
--pod-network-cidr=192.168.0.0/16
然后按照提示进行操作
在master节点部署网络插件,并根据配置创建资源
# 查看集群所有节点 (在master节点中操作)
kubectl get nodes
#根据配置文件,给集群创建资源
kubectl apply -f xxx.yaml
#查看集群中部署了哪些应用 (在master节点中操作)
kubectl get pods -A # 相当于docker ps 运行中的应用在docker中叫容器,在k8s叫pod
五、部署可视化界面dashboard
都在master节点执行:
yum install -y wget #先安装wget
wget https:raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
或者直接通过浏览器请求以上路径获取内容,然后添加在yaml文件中
vi dashboard.yaml
kubectl apply -f dashboard.yaml 命令即可创建应用
====================================================================
一、Namespace
名称空间,用来隔离资源:如下所示,开发环境和生产环境在不同的名称空间中
若不指定名称空间,默认都部署到了default名称空间里
①、通过命令的方式
kubectl create ns hello #创建hello命名的名称空间
kubectl delete ns hello #删除名称空间
②、通过资源文件的方式
kubectl apply -f hello.yaml 创建资源
apiVersion: v1
kind: Namespace
metadata:
name: hello
kubectl delete -f hello.yaml 该配置文件下创建的所有资源都被删除
二、Pod
①、通过命令方式创建pod
kubectl run mynginx --image=nginx
kubectl get pod # 默认是default名称空间下的pod kubectl get pod -n default
kubectl get pod -owide # 查看更详细的,携带ip
curl 192.168.169.136 #访问nginx应用
kubectl describe pod #查看具体的创建过程(被分配到哪个节点上创建)
kubectl delete pod mynginx # 删除pod
kubectl logs mynginx # 查看pod日志
kubectl exec -it mynginx -- /bin/bash #进入mynginx内部控制台
②、通过yaml文件创建pod
kubectl apply -f pod.yaml
kubectl delete -f pod.yaml
apiVersion:
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
namespace: default #指定名称空间
spec:
containers:
- image: nginx
- name: mynginx
③、可视化界面中创建
④、pod中多容器
vi multicontainer-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
-image: nginx
name: nginx
-image: tomcat:8.5.68
name: tomcat
kubectl apply -f multicontainer-pod.yaml
kubectl get pod
通过命令进行访问:
curl 192.168.36.68:8080
curl 192.168.36.68:80
①、控制pod,使pod拥有自愈能力
kubectl run mynginx --image=nginx #使用该命令创建的pod,删除之后就彻底不存在了
kubectl create deploment mytomcat --image=comcat:8.5.68 #使用该命令创建的pod,删除之后,系统会自动创建一个新的容器(自愈能力)
kubectl get deploy # 查看deploy
kubectl delete mytomcat # 删除部署才能彻底删除pod
②、多副本能力
kubectl create deployment my-dep --image=nginx --replicates=5
watch -n 1 kubectl get pod #每秒监控
kubectl scale deploy/my-dep --replicas=5 #扩容
kubectl scale deploy/my-dep --replicas=2 # 缩容
同理,通过修改配置文件或者图形化界面的方式都可以进行扩容缩容
④、自愈&故障转移
如果pod挂掉,kubernetes会尝试重启,叫做自愈
若pod所在的服务器挂掉,会将该pod转移到其他服务器继续提供服务。
⑤、滚动更新
当对容器进行升级时,其容器内的新版本启动成功后才能提供服务替换旧版本容器,一旦新版本容器启动失败,则依然由旧版本提供服务。
#先查看当前容器的版本
kubectl get deploy my-dep -oyaml
#启动新版本
kubectl set image deployment/my-dev nginx=nginx:1.16.1 --record
kubectl rollout status deployment/my-dev
⑥、版本回退
# 历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚到指定版本
kubectl rollout undo depoyment/my-dep --to--revision=2
四、Service
两种方式访问:集群ipclusterIP和NodePort
①、使用命令的方式创建对外暴露service
# 集群内任意访问
kubectl expose deploy my-dep --port=8000 --target-port=80
# 查看pod标签
kubectl get pod --show-labels
# 使用标签检索pod
kubectl get pod -l app=my-dep
当多次访问service暴露的端口ip,可以看到反馈保护不同pod的反馈内容
(负载均衡访问)
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=ClusterIP #集群内部访问
kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort #集群外也可以访问
NodePort范围30000-32767
①、安装Ingress
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
# 修改镜像
vi deploy.yaml
# 将image的值改为如下:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
#检查安装环境
kubectl get pod,svc -n ingress-nginx
#最后别忘记把svc暴露的端口要放行
通过NodePort暴露的端口
通过yaml进行生成一个如下解构的pod组合
②、规则制定的yaml文件
多个规则根据配置文件的 - host配置多个 kubectl apply -f ingress.yaml
生成管理两个域名的规则
可以通过kubectl edit ing ingress-host-bar修改规则
六、存储抽象
存储层的技术实现有以下几种:
以NFS为例:
当某个节点的Pod崩溃,其挂载的数据能够提前在其他节点同步,当在其他节点启用Pod可以立即获得挂载数据。
①、搭建一个NFS存储的网络结构
# 所有节点安装
yum install -y nfs-utils
# 主节点
echo "/nfs/data/*{insecure,rw,sync,no_root_squash}" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
# 配置生效
exports -r
# 查看
exports
# 从节点
showmout -e 10.140.122.4 #(主节点命令 ip -a 获取到)
# 执行以下命令挂载nfs服务器上共享目录到本机路径/root/nfsmout
mkdir -p /nfs/mount
mount -t nfs 10.140.122.4:/nfs/data /nfs/data #将远程服务目录挂载本机目录
# 返回到主节点进行验证
# 写入一个测试文件(同理在从节点进行修改文件,主节点文件也会相应被修改)
echo "hello nfs server" /nfs/mount/test.txt
③、持久卷PV&持久卷声明PVC
持久卷:将应用需要持久化的数据 保存到指定位置
持久卷声明:生命需要使用持久卷的规格
静态供应
# nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
创建持久卷PV(三个不同容量的PV,其文件内容Gi改成小写gi,否则创建失败)
创建PVC
创建Pod绑定PVC,系统自动为PVC找到合适大小的pv进行绑定
直接和申请书绑定
vi redis.conf # 准备一个配置文件 内容:appendonly yes
# 创建一个配置集
kubectl create cm redis-conf --from-file=redis.conf
cubectl get cm # 查看配置集
rm -rf redis.conf # 删除
配置集内容
精简之后的内容如下:
启动一个redis镜像的pod,进行挂载
通过命令kubectl edit cm redis-conf进行修改配置内容
七、Secret