kubernetes学习笔记(一)
kubernetes学习笔记(一)
kubernetes简介
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
kubernetes特点
自动化部署和扩展:Kubernetes可以自动部署容器应用,并根据需要自动扩展或缩减应用实例的数量。
服务发现和负载均衡:Kubernetes提供了服务发现机制,使得容器中的应用可以容易地找到彼此并与之通信。同时,它支持内置的负载均衡,可以将流量分发到多个实例。
存储编排:Kubernetes支持多种存储系统,包括本地存储、网络存储(如NFS、Ceph等),以及持久卷(Persistent Volumes),使得存储的管理更加灵活和高效。
自动回滚和自我修复:如果应用实例失败,Kubernetes可以自动重启它们。此外,它还可以根据定义的策略自动回滚应用版本。
密钥和配置管理:Kubernetes支持配置管理,允许应用以环境变量的形式或通过配置文件的方式获取所需的配置信息。此外,它还支持密钥管理,可以安全地存储和管理敏感信息。
批处理和定时任务:Kubernetes支持批处理作业和定时任务,可以通过Cron Jobs等功能实现。
自我修复能力:Kubernetes能够监控应用的状态,并在节点故障或应用故障时自动采取措施(如重启、替换实例等)。
可扩展性和灵活性:Kubernetes架构设计允许它在不同的基础设施上运行(如物理机、虚拟机、公有云、私有云等),具有很高的可扩展性和灵活性。
社区和生态系统:Kubernetes拥有一个非常活跃的社区和生态系统,有大量的插件、工具和集成解决方案(如Helm、Istio、Prometheus等),可以满足各种不同的需求。
安全性:Kubernetes提供了多层次的安全特性,包括网络策略、角色基础访问控制(RBAC)、密钥管理等,确保容器应用的安全性。
kubernetes安装
在安装kubernetes之前需要安装docker。这里只提供centos安装方式,其他平台可以看前面docker的学习笔记。
centos官方安装
1 | 安装一些系统必要的工具 |
kubernetes集群规划
这里是使用虚拟机去创建了3个centos7.5的主机。分别为其分配2h2g的资源。按理来说master节点的至少2h4g的资源。work节点至少需要1h2g的资源,但是由于电脑资源有限,所以就为每一个节点包括master节点2h2g的资源。至于磁盘的话20-30G就行了,当然资源肯定是越多越好了,也可以使用阿里云或者是其他云厂商的按需付费的云服务器(抢占式实例),实例按小时收费那种。做完实验以后就可以回收停止付费,也是一种不错的选择,也还比较便宜。
这不介绍master和work的区别,我认为至少需要把集群搭起来,才能更好的学习kubernetes。
这里搭建的测试学习环境有太多的主观因素,生产环境配置还请斟酌。
1、基础环境
为每台主机安装kubelet、kubeadm、kubectl
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
开启机器上的某些端口
禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。
设置防火墙规则、设置不同的hostname、互信
2、虚拟机网络配置
这里使用NAT模式的网络,为其指定的私网网段是172.31.26.X如下
为master分配IP为172.31.26.3主机域名master,node01的IP为172.31.26.4主机域名node01,node02的IP为172.31.26.5主机域名node02
若是使用云主机以阿里云的ECS为例,可以在一下栏目去创建专有网络,
在创建专有网络时选择IPV4,网段为172.16.0.0/16如下。
由于这个172.16.0.0/16这个网络范围太大可以有65536-2个主机地址,所以可以通过交换机进一步去划分子网如下。
创建实例的时候选择对应得专有网络和交换机即可。
3、基础环境设置
设置各个主机自己的主机名
1 | hostnamectl set-hostname xxxx |
将 SELinux 设置为 permissive 模式(SELinux仍然监控和记录所有的安全违规事件,但不会强制执行任何拒绝操作。这意味着即使某些操作违反了策略,系统也会允许这些操作继续进行,但是会在日志中记录下来,但是有的教程说是必须把SELinux设置成disabled。有的说是 permissive就行。这里设置成permissive
1 | sudo setenforce 0 #临时关闭 |
关闭swap分区,注释/etc/fstab文件中所有swap分区相关的挂载配置
1 | swapoff -a |
允许 iptables 检查桥接流量
1 | cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
安装kubelet、kubeadm、kubectl,首先添加kubelet的yum源。
1 | cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo |
下载kubelet需要的镜像,这里的镜像地址是我阿里云的容器服务的地址,上面已经有kubelet需要的镜像了,可以直接使用我的,也可以其他。
1 | sudo tee ./images.sh <<-'EOF' |
首先为所有的机器添加主机域名映射如下,这里根据实际情况填写即可。
1 | vi /etc/hosts |
虚拟机的话可以直接关闭防火墙
kubernetes集群安装
1、master节点初始化。
1 | 在master节点执行以下命令 |
保证所有网络范围不重叠
执行完上诉命令显示如下表示主节点初始化成功。
1 | 出现以下证明master节点初始化成功 |
2、work节点加入
在node01和node02节点执行以下命令,该信息是由初始化master节点成功后直接给出的。
1 | kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \ |
3、安装网络组件calico
1 | curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O |
该组件是用于节点之间通信的,calico镜像可能会拉取失败可以直接通过docker直接拉取。
网络组件安装好以后通过如下命令去查看pod,有如下信息
1 | [root@cluster-master ~]# kubectl get pod -A |
4、查看节点是否就绪
使用以下命令查看,status为Ready表示节点的已经就绪了,若是是有节点挂了,status状态是NotReady。
1 | [root@cluster-master ~]# kubectl get nodes |
5、部署一个DashBoard
使用yaml配置的方式去快速部署一个bashboard。
1 | curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O |
修改访问端口
1 | kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard |
查看dashboard运行在哪个端口
1 | kubectl get svc -A |grep kubernetes-dashboard |
云服务器的记得在安全组开放这个端口,通过集群中任意集群的IP加端口都可以访问。这个端口是随机分配的,根据实际情况为准。
另外该地址需要通过https方式访问。
创建访问账号,任然是通过yaml的方式去创建
1 | [root@cluster-master ~]# vi dash.yaml |
创建令牌访问
1 | kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}" |
会的到一个token如下,就可以在dashboard中通过token登录了。
1 | eyJhbGciOiJSUzI1NiIsImtpZCI6IjVibVBCMTByTjZxcFdkZFlhTFgzV3FtbDdER0xmd1pTelZUN1YwT1pEdUkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTl3NndjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxNmYxMDQ3MS00YWVhLTQxMWYtOTM5Yi1mY2JmMGJhNjg4MWIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.aqNjyfbQkTwYKQmT9Uga0rPUfHOH8qDFZyXhGLnmWkTGgfAgESZwJLzXpWcMtEtAQapYY_vehRmHg_cZ0LDTbiHqqsb45gOtjxjuHXSFPV2lDd9Pn2Adeq8ALWOXTwOgHM6xEBjrCCfuT9hdIz1WNfWlSbbb5XugZvM9jhjI6qQ0s2MSkXYP7kb1graeGkgOzaZiM9-qVxoQf0D0wUJIa4yPW-BYlVme_O8ZXArfTss7LgmlAKz14deGbvyY_sKuRJIoZgiojLZtYBu0L1fzci36TXrOckbRlFDpcCf68_CRp0SzI7eyoczxSJ9RxixDKavaqRXMsIeMxHmD8I2TzA |
界面如下,输入token就可以登陆了。
完成上述一个用来学习的kubernetes集群就安装好了。
kubernetes安装总结
集群安装常见问题
1、在安装calico组件是k8s提示Pod出现Init:ImagePullBackOff
出现这个问题的话是镜像拉取失败了,可以通过一下命令查看 pod安装失败的原因
kubectl describe pod pod名字 -n 名称空间
若是镜像没有拉取成功,可以使用docker手动拉取镜像。一般来说是docker的镜像仓库配置的问题。
2、work节点加入时报错如下
1 | error execution phase preflight: couldn't validate the identity of the API Server: Get "https://cluster-master:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": dial tcp 172.31.26.3:6443: connect: no route to host |
存在这个问题的话,虚拟机搭建的集群记得关闭防火墙,若是服务器的话需要在安全组中放行6443端口号。
systemctl disable firewalld –now
setenforce 0
还有可能是token过期了,重新获取token
kubeadm token create –print-join-command
3、在访问dashboard时页面提示
您的连接不是私密连接
攻击者可能会试图从 172.31.26.3 窃取您的信息(例如:密码、消息或信用卡信息)。详细了解此警告
方法一:添加到Chrome快捷方式标志 –ignore-certificate-errors ,然后重新打开并浏览到您的网站。在快捷方式的目标栏目的后面添加上述
方法二:当查看“您的连接不是私密”屏幕时:输入 thisisunsafe,当Chrome不允许通过点击设置例外时,例如对于此HSTS案例,这将允许安全例外。(亲测有效)
完成上面的步骤,就可以搭建一个学习测试的kubernetes集群了。其实很早就接触了这个东西,但是一直没去学习,这次就准备好好的去学习一下。