K8s存储
这样生成的pod名字不固定,IP不固定
此时是访问一个无状态的服务,那没什么影响,访问到访问不到都没啥影响
但是如果有一个有状态的服务,他要指定master,那此时的pod做不了负载均衡
statefulset控制器
无头服务·
创建一个 Headless Service(无头服务),为 StatefulSet 的 Pod 提供网络访问能力。
clusterIP: None:Headless Service 不分配集群 IP,而是通过 DNS 直接解析到后端 Pod 的 IP。
与 StatefulSet 配合时,会为每个 Pod 生成固定的 DNS 记录(格式:{pod-name}.{service-name}.{namespace}.svc.cluster.local),例如 web-0.web.default.svc.cluster.local。
configmap
configmap的功能
configMap用于保存配置数据,以键值对形式存储。
configMap 资源提供了向 Pod 注入配置数据的方法。
镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
etcd限制了文件大小不能超过1M
configmap的使用场景
填充环境变量的值
设置容器内的命令行参数
填充卷的配置文件
configmap创建方式
字面值创建
授权证书会被多个文件里认证,这个认证是绝对不能删除的
通过文件创建
把这个文件的内容换了一种方式来储存,并且保存到了集群中
通过yaml文件创建
指定文件,并加上文件内容
举例:
使用configmap填充环境变量
name指定键的名称,valueFrom名字的来源
apiVersion: v1
kind: Pod
metadata:
labels:
run: phpmysqladmin
name: phpmysqladmin
spec:
containers:
- image: mysql:8.0
name: mysql
ports:
- containerPort: 3306
envFrom:
- configMapRef:
name: phpmyadmin
- image: phpmyadmin:latest
name: phpmyadmin
ports:
- containerPort: 80
protocol: TCP
hostPort: 80
envFrom:
- configMapRef:
name: phpmyadmin
k8s中的微服务
什么是微服务
微服务可以通过标签来找到能发布的服务
ipvs模式
之前说过,iptables防火墙里的策略不好,所以这里我们可以换成ipvs模式
查看集群配置
更改集群的配置
更改集群资源的命令
如果什么都没有,说明是默认的使用iptables,这里我们加上ipvs
修改配置后,要重启,这里可以删掉之前的网络配置pod,重新刷新新的pod出来,此时就是新策略的pod
微服务类型详解
clusterip
clusterip模式只能在集群内访问,并对集群内的pod提供健康检测和自动发现功能
追加内容,此时微服务和控制器就在一个配置文件里了
只有集群内部的IP,集群外部的不暴露
前面是微服务的名称加上命名空间,对微服务进行域名解析,能解析到她的IP
ClusterIP中的特殊模式headless
之前有了无头服务,要删掉,不然影响实验
没有了IP以后,后端就没有调度了
此时我们可以用dns来写,把要访问的server直接指定到后端的服务器中去
开启一个busyboxplus的pod测试
nodeport
之前的服务设置了无头服务,这里要删除之前环境,重新运行
多了一个端口
这个端口用来直接对外暴露
nodeport在集群节点上绑定端口,一个端口对应一个服务
直接负载到下面两个
对应的端口是不固定的,但是我们可以直接指定,但是有范围限制最大30000
k8s中控制器的使用
控制器也是管理pod的一种手段
自主式pod:pod退出或意外关闭后不会被重新创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod
当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复
查看容器名称
replicaset 示例
删除pods还会重新建一个
修改个数,可以拉伸也可以声明
再次重启yml,会根据yml中的内容再次刷新个数
鍒犻櫎replicas
deployment 控制器
[root@master ~]# kubectl create deployment dep --image myapp:v1 --dry-run=client -o yaml > dep.yml
版本更新
直接在编辑文件里声明就行
查看更新效果
更新的过程是重新建立一个版本的RS,新版本的RS会把pod 重建,然后把老版本的RS回收
版本回滚
滚动更新策略
这次更新了一部分,下次更新就5秒一次,一共要更新8个
影响最小的,最丝滑的更新策略
更一个关一个
暂停及恢复
回收
Deamonset控制器
pod管理
Pod
拉取镜像
docker load -i nginx-latest.tar.gz
docker load -i busybox-latest.tar.gz
vim test.yml
vim test.yml
查看所有命名空间里的pod
[root@master ~]# kubectl get pods -A
查看所有pod的详细信息
[root@master ~]# kubectl get pods -A -o wide
如何直接运行:run的方式
apiVersion: v1
kind: Pod
metadata:
labels:
run: timinglee
name: ziyuan
spec:
containers:
- image: myapp:v1
name: myapp
resources:
limits:
cpu: 500m
memory: 100M
requests:
cpu: 500m
memory: 100M
Pod 高级配置:调度、网络与初始化
节点调度控制使用
apiVersion: v1
kind: Pod
metadata:
labels:
run: timinglee
name: test1
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
restartPolicy: Always
containers:
- image: myapp:v1
name: myapp
yaml
网络模式配置
apiVersion: v1
kind: Pod
metadata:
labels:
run: timinglee
name: test1
spec:
hostNetwork: true
restartPolicy: Always
containers:
- image: busybox:latest
name: busybox
command: ["/bin/sh", "-c", "sleep 100000"]
yaml
验证网络
初始化容器配置 initContainers:
apiVersion: v1
kind: Pod
metadata:
labels:
run: init-example
name: init-example
spec:
containers:
- image: reg.timinglee.org/library/myapp:v1
name: init-example
initContainers:
- name: init-myservice
image: busybox
command: ["sh", "-c", "until test -e /testfile; do echo waiting for myservice; sleep 2; done"]
就绪探针示例
apiVersion: v1
kind: Pod
metadata:
labels:
run: readiness
name: readiness
spec:
containers:
- image: myapp:v1
name: myapp
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
[root@master ~]# kubectl describe services
k8s部署
K8s搭建
安装docker
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
[root@reg yum.repos.d]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/syste
[root@reg yum.repos.d]# docker info
安装harbor
[root@reg ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout /data/certs/timinglee.org.key -addext "subjectAltName = DNS:reg.timinglee.org" -x509 -days 365 -out /data/certs/timinglee.org.crt
在浏览器中访问harbor的关键
[root@reg harbor]# ./install.sh --with-chartmuseum
[root@reg ~]# for i in 100 10 20
> do
> ssh -l root 172.25.254.$i mkdir -p /etc/docker/certs.d
> scp /data/certs/timinglee.org.crt root@172.25.254.$i:/etc/docker/certs.d/ca.crt
> done
[root@master ~]# cd /etc/docker/
[root@master docker]# ls
certs.d
[root@master docker]# vim daemon.json
[root@master docker]# for i in 10 20 ; do scp daemon.json root@172.25.254.$i:/etc/docker/; done
安装K8S部署工具(master node1和node2都要安装)
#部署软件仓库,添加K8S源
[root@k8s-master ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm
gpgcheck=0
#安装软件
[root@k8s-master ~]# dnf install kubelet-1.30.0 kubeadm-1.30.0 kubectl-1.30.0 -y
也是master node1和node2都要安装(我这里就显示了一台)
三台机子都要改
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
#指定网络插件名称及基础容器镜像
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.timinglee.org/k8s/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
在master节点拉取K8S所需镜像
[root@master ~]# docker images | awk '/google/{print $1":"$2}' |awk -F / '{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
oot@master ~]# docker images | awk '/reg/{print $0}'
[root@master ~]# docker images | awk '/reg/{print $1":"$2}'
[root@master ~]# docker images | awk '/timinglee/{system("docker push " $1":"$2)}'
[root@master ~]# docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0 reg.timinglee.org/k8s/kube-apiserver:v1.30.0
[root@master ~]# docker push reg.timinglee.org/k8s/kube-apiserver:v1.30.0
启动kubelet服务
[root@k8s-master ~]# systemctl status kubelet.service
集群初始化
#启动kubelet服务
[root@k8s-master ~]# systemctl status kubelet.service
#执行初始化命令
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.timinglee.org/k8s \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
#指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@master ~]# source ~/.bash_profile
[root@master ~]# kubectl get nodes
root@master ~]# vim kube-flannel.yml
一定要关防火墙
在此阶段如果生成的集群token找不到了可以重新生成
[root@k8s-master ~]# kubeadm token create --print-join-command
kubeadm join 172.25.254.100:6443 --token 5hwptm.zwn7epa6pvatbpwf --discovery-token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23