Kubernetes学习文档

Kubernetes学习文档

特性
  • 灰度更新 不影响业务正常运转
  • 高可用 不宕机 自动灾难恢复
  • 一键回滚到历史版本
  • 方便的伸缩扩展(应用伸缩,机器加减) 提供负载均衡
  • 有一个完善的生态
不同的应用部署方案

image-20220728092456835
image-20220728092456835

  • 传统部署方式:
    • 应用直接在物理机上部署 机器资源分配不好控制 出现bug时 可能机器的大部分资源被某个应用占用 导致其他应用无法正常运行 无法做到应用隔离
  • 虚拟机部署
    • 在单个物理机上运行多个虚拟机 每个虚拟机都是完整独立的系统 性能损耗大
  • 容器部署
    • 所有容器共享主机的系统 轻量级的虚拟机 性能损耗小 资源隔离 CPU和内存可按需分配
什么时候需要Kubernetes
  • 当应用只是跑在一台机器 直接一个docker+ docker-compose 就够了 方便轻松
  • 当应用需要跑在3 4 台机器 依旧可以每台机器单独配置运行环境 + 负载均衡器
  • 当应用访问数不断增加 机器逐渐增加到上百台 上千台 每次加机器 软件更新 版本回滚 就会变得非常麻烦 这时候就需要kubernetes 轻松管理百万千万机器的集群
  • kubernetes 可以为你提供集中式的管理集群机器的应用 加机器 版本升级 版本回滚都是一个命令就搞定的事情 不停机的灰度更新 确保高可用 高性能 搞扩展
kubernetes集群架构
  • master

    • 主节点 控制平台 不需要很高的性能 不跑任务 通常一个就行了 也可以开多个主节点来提高集群的可用度
  • worker

    • 工作节点 可以是虚拟机或物理计算机 任务都在这里跑 机器性能都需要好点 通常有很多个 可以不断加机器扩大集群 每个工作节点由主节点管理
  • 重要概念pod

    • 豆荚 k8s调度 管理的最小单位 一个pod可以包含一个或多个容器 每个pod都有自己的虚拟IP 一个工作节点可以有多个pod 主节点会考量负载自动调度pod到哪个节点运行

image-20220728093657693
image-20220728093657693

kubernetes组件
  • kube-apiserver API服务器 公开了kubernetes API
  • etcd 键值数据库 可以作为保存 kubernetes所有集群数据的后台数据库
  • kube-scheduler 调度pod到哪个节点运行
  • kube-controller 集群控制器
  • cloud-controller 与云服务商交互

image-20220728093942078
image-20220728093942078

安装kubernetes

查看节点

kubectl get node 

docker run –privileged -d –name mysql84 -v /etc/mysql:/etc/mysql -v /var/lib/data/mysql:/var/lib/mysql -v /var/lib/mysql-files:/var/lib/mysql-files -p 3310:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123456 mysql

ubuntu重装mysql 1、删除 mysql

1 sudo apt-get autoremove –purge mysql-server-5.0

2 sudo apt-get remove mysql-server

3 sudo apt-get autoremove mysql-server

4 sudo apt-get remove mysql-common (非常重要)

上面的其实有一些是多余的,建议还是按照顺序执行一遍

清理残留数据

dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P

2、安装 mysql

1 sudo apt-get install mysql-server

记得启动服务 设置密码

https://docs.docker.com/desktop/networking/ 我想从容器连接到主机上的服务 主机有一个不断变化的 IP 地址(如果您没有网络访问权限,则没有)。我们建议您连接到 host.docker.internal解析为主机使用的内部 IP 地址的特殊 DNS 名称。这是出于开发目的,不适用于 Docker Desktop 之外的生产环境。

您也可以使用gateway.docker.internal.

如果您的机器上安装了 Python,请使用以下说明作为示例,从容器连接到主机上的服务:

运行以下命令在端口 8000 上启动一个简单的 HTTP 服务器。

python -m http.server 8000

如果您已安装 Python 2.x,请运行python -m SimpleHTTPServer 8000.

现在,运行一个容器,安装curl,并尝试使用以下命令连接到主机:

docker run –rm -it alpine sh apk add curl curl http://host.docker.internal:8000 exit

minikube start –kubernetes-version=v1.23.3 –base-image=“kicbase/stable:v0.0.32”

minikube start –kubernetes-version=v1.23.3 –registry-mirror=https://bmtb46e4.mirror.aliyuncs.com –vm-driver=docker –base-image=“anjone/kicbase” –image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

kubectl get node

kubectl run testapp –image=ccr.ccs.tencentyun.com/hfut/e-book-gin:v1.0

kubectl apply -f ./mysql.yaml

kubectl get pod

kubectl get deployment

kubectl get pod -o wide

kubectl describe pod [testapp]

kubectl logs testapp –previous

kubectl delete pod my-mysql-6b8cf957fc-2sl59

kubectl delete deploy/my-mysql

不要对etc/ssh目录盲目扩大权限 chmod 600 /etc/ssh/*key 使用ssh -t 查看问题 lsof -i:22 确定是否开着

1、卸载 之前是用yum安装的,现在通过yum去卸载yum remove -y mysql find / -name mysql 找到残留的文件,再通过rm -rf去删除对应的文件

注意将所有有关的文件全部删除,不然会有问题!

2、安装 yum update yum install mysql-server

ps -ef | grep mysql

systemctl start mysqld

systemctl enable mysqld

systemctl status mysqld

3、修改root用户密码 修改root用户的密码。

alter user ‘root’@’localhost’ identified by ‘password’

刷新权限

flush privileges

灰度更新

先启动 启动成功再把之前的销毁

伸缩副本
kubectl scale deployment test-k8s --replicas=2

查看历史版本
kubectl rollout history deployment [deployment]

回到上个版本
kubectl rollout undo deployment [deployment]

回退指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
删除部署
kubectl delete deployment test-k8s

查看所有信息
kubectl get all

重新部署
kubectl rullout restart deployment test-k8s

# 命令修改镜像,--record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record

暂停运行 去做想做的事情 比如修改其他的pod之类的
kubectl rollout pause deployment my-mysql

恢复
kubectl rollout resume deployment my-mysql

输出到文件
kubectl get deployment my-mysql -o yaml >> toyaml.yaml

kubectl delete all --all

可以将pod指定到某个节点进行运行
在yaml里指定
工作负载分类
  • deployment
    • 适合无状态应用 所有POD等价 可以替代
  • statefulset
    • 有状态的应用 适合数据库这种类型
  • daemonset
    • 在每个节点上跑一个pod 可以用来做节点监控 节点日志收集等等
  • job & cronjob
    • job用来表达一次性的任务 而cronjob会根据其时间规划反复运行
现存问题
  • 每次只能访问一个pod 没有负载均衡自动转发到不同pod
  • 访问还需要端口转发
  • pod重建之后ip变了 名字也变了
service

特性

  • service通过label关联对应的pod
  • service生命周期不跟pod绑定 不会因为pod重新建立而改变IP
  • 提供了负载均衡功能 自动转发流量到不同的pod
  • 可对集群外部提供访问端口
  • 集群内部可通过服务名字访问

image-20220806093538047
image-20220806093538047

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    app: test-pod
#    默认 ClusterIP 集群内可访问 NodePort节点可访问 LoadBalancer 负载均衡模式 (需要负载均衡器才可用)
  type: NodePort
  ports:
    - port: 8080  #本 service端口
      targetPort: 7777 #容器端口
      nodePort: 31000 #节点端口 范围固定 从30000-32767
kubectl get service

kubectl get svc

type 可以有三种

loadbalancer需要云服务提供商的支持 逻辑可以安装metallb测试 会额外生成一个IP对外提供服务

nodeport需要进入节点访问 所以通过docker进入minikube 访问31000才能get到

clusterIP 默认的 仅在集群内可用

headless 适合数据库 clusterip设置为none就变成headless 就不会分配ip 后续讲解具体用法

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy