kubernetes学习笔记(一)
kubernetes简介
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
官方网站:https://kubernetes.io/
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官方安装
#安装一些系统必要的工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查/etc/yum.repos.d/docker-ce.repo 中的ur[地址是不是都是阿里云的]
vi /etc/yum.repos.d/docker-ce.repo
# 如果不是,那么把download-stage.docker.com全部替换为mirrors。aliyun.com/docker-ce/#更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce#使用docker version可以看到client端的信息
docker version#启动服务器再次使用docker version 就可以看到服务器端和客户端的docker信息了
systemctl start docker
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、基础环境设置
设置各个主机自己的主机名
hostnamectl set-hostname xxxx
#master节点 hostnamectl set-hostname master
#work节点hostnamectl set-hostname node01
将 SELinux 设置为 permissive 模式(SELinux仍然监控和记录所有的安全违规事件,但不会强制执行任何拒绝操作。这意味着即使某些操作违反了策略,系统也会允许这些操作继续进行,但是会在日志中记录下来,但是有的教程说是必须把SELinux设置成disabled。有的说是 permissive就行。这里设置成permissive
sudo setenforce 0 #临时关闭
sudo vi /etc/selinux/config #修改config如下 需重启电脑生效
SELINUX=permissive
关闭swap分区,注释/etc/fstab文件中所有swap分区相关的挂载配置
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<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
安装kubelet、kubeadm、kubectl,首先添加kubelet的yum源。
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.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOFsudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
systemctl enable --now kubelet#使用systemctl status kubelet查看时每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环
下载kubelet需要的镜像,这里的镜像地址是我阿里云的容器服务的地址,上面已经有kubelet需要的镜像了,可以直接使用我的,也可以其他。
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/sxc-k8s-images/$imageName
done
EOFchmod +x ./images.sh && ./images.sh
首先为所有的机器添加主机域名映射如下,这里根据实际情况填写即可。
vi /etc/hosts
172.31.26.3 cluster-master
172.31.26.4 node01
172.31.26.5 node02
虚拟机的话可以直接关闭防火墙
kubernetes集群安装
1、master节点初始化。
#在master节点执行以下命令
kubeadm init \
--apiserver-advertise-address=172.31.26.3 \ #apiserver的地址。
--control-plane-endpoint=cluster-master \ #主节点的域名。
--image-repository registry.cn-hangzhou.aliyuncs.com/sxc-k8s-images \ #镜像地址
--kubernetes-version v1.20.9 \ #kubernetes-version版本
--service-cidr=10.96.0.0/16 \ #k8s为service所分配的私网IP范围
--pod-network-cidr=192.168.0.0/16 #k8s为pod所分配的私网IP范围
保证所有网络范围不重叠
执行完上诉命令显示如下表示主节点初始化成功。
#出现以下证明master节点初始化成功
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:#执行以下三条命令mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.conf #执行该命令You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8 \--control-plane Then you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8
2、work节点加入
在node01和node02节点执行以下命令,该信息是由初始化master节点成功后直接给出的。
kubeadm join cluster-master:6443 --token 5qvdjf.ztj534mpyvz4x2aq \--discovery-token-ca-cert-hash sha256:364e66000f1c0d3d9cd168806f01bee8f1456f2585c91737caf4dc6ea6d619c8
3、安装网络组件calico
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
kubectl apply -f calico.yaml
该组件是用于节点之间通信的,calico镜像可能会拉取失败可以直接通过docker直接拉取。
网络组件安装好以后通过如下命令去查看pod,有如下信息
[root@cluster-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-577f77cb5c-pl9gh 1/1 Running 0 55m
kube-system calico-node-n9t97 1/1 Running 0 55m
kube-system coredns-584db6f4bf-fhg9z 1/1 Running 0 58m
kube-system coredns-584db6f4bf-fmhkx 1/1 Running 0 58m
kube-system etcd-cluster-master 1/1 Running 1 58m
kube-system kube-apiserver-cluster-master 1/1 Running 1 58m
kube-system kube-controller-manager-cluster-master 1/1 Running 4 58m
kube-system kube-proxy-l89mb 1/1 Running 0 9m40s
kube-system kube-proxy-pm96g 1/1 Running 1 58m
kube-system kube-proxy-z2lh6 1/1 Running 0 10m
kube-system kube-scheduler-cluster-master 1/1 Running 3 58m
4、查看节点是否就绪
使用以下命令查看,status为Ready表示节点的已经就绪了,若是是有节点挂了,status状态是NotReady。
[root@cluster-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-master Ready control-plane,master 67m v1.20.9
node01 Ready <none> 18m v1.20.9
node02 Ready <none>
5、部署一个DashBoard
使用yaml配置的方式去快速部署一个bashboard。
curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml -O
kubectl apply -f recommended.yaml
修改访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
#将type: ClusterIP 改为 type: NodePort
查看dashboard运行在哪个端口
kubectl get svc -A |grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.44.83 <none> 8000/TCP 7m3s
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.250.52 <none> 443:30592/TCP 7m4s
云服务器的记得在安全组开放这个端口,通过集群中任意集群的IP加端口都可以访问。这个端口是随机分配的,根据实际情况为准。
另外该地址需要通过https方式访问。
创建访问账号,任然是通过yaml的方式去创建
[root@cluster-master ~]# vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
创建令牌访问
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登录了。
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节点加入时报错如下
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集群了。其实很早就接触了这个东西,但是一直没去学习,这次就准备好好的去学习一下。