== 真正的生产环境采用那种方式部署呢?==
本次规划两台机器:
192.168.129.15(master)(可修改配置允许master运行node)
192.168.130.41(node)
cat >> /etc/hosts<
192.168.130.41 k8s-node1
EOF
hostnamectl set-hostname k8s-master
bash
hostnamectl set-hostname k8s-node1
bash
1、添加阿里云yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[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
EOF
2、安装
在每个节点,都执行如下指令。指定版本号安装。其中kubectl在master安装即可,node安装也无妨。
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
设置自动启动
systemctl enable kubelet
== kubeadm不单纯是简化部署K8S集群,同时采用了容器化方式部署k8s组件。(只有kubelet不是采用容器化) ==
3、部署master
在master节点上执行如下指令:
kubeadm init --apiserver-advertise-address=192.168.129.15 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all
kubeadm init 创建一个master节点。
–apiserver-advertise-address=192.168.129.15 :指定apiserver的地址,用于其他节点连接用的内网地址。
–image-repository registry.aliyuncs.com/google_containers :镜像仓库,指定了阿里云的仓库。
–kubernetes-version v1.19.4 版本
–service-cidr=10.96.0.0/12 :用在service的网段。
–pod-network-cidr=10.244.0.0/16:用在pod的网段。
–ignore-preflight-errors=all: 忽略检查的一些错误。
执行以上语句后,会依次做出如下的工作:
a、检查环境:[preflight] Running pre-flight checks。如swap是否关闭等。
b、拉取k8s部署所需要的镜像。
c、创建证书。生成k8s正式和etcd证书。
d、生成kubeconfig文件
e、启动kubelet。
f、部署管理节点组件,用镜像启动容器。
通过如下指令,可以看到已经拉起的容器。
kubectl get pods -n kube-system
g、启动etcd
h、上传配置文件、证书到k8s中。其他节点启动后会拉取配置文件进行启动。
i、给master标记污点。告诉k8s,新创建的容器不允许分配到此接点上。
执行成功后,会打印如下:
执行提示的语句,将连接集群的配置文件,copy到默认路径下。从而使用命令行管理工具去管理集群。
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf .kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4、部署node
执行在master init之后,打印出来的语句
kubeadm join 192.168.129.15:6443 --token 5rgh7r.68w97njomg1xzirt \
--discovery-token-ca-cert-hash sha256:19a54b565efc450d704f9f45aed113e25535474d3d14b37965dafecf47b492b3
执行成功后,在master上执行查看所有节点,kubectl get node。可以看到注册进来的节点状态为NotReady。
journalctl -u kubelet
5、部署容器网络插件calico.
在整个kubernetes集群里,pod都是分布在不同的主机上的,为了实现这些pod的跨主机通信所以我们必须要安装CNI网络插件,这里选择calico网络
在所有节点上执行
下载yaml文件。
如官网下载不下来,可通过点击下载
calico下载
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
#修改节点内容,将值修改成,kubeadm init 时候指定的--pod-network-cidr节点内容.也就是pod网段
vi calico.yaml
# - name: CALICO_IPV4POOL_CIDR
# value: "10.244.0.0/16"
应用:
kubelet apply -f calico.yaml
查看要安装的镜像
部署之后,calico也会以容器的方式去启动.
安装完成后,查看pods。
kubectl get pods -n kube-system
注意:
在后面重启k8s的过程中,发现,calico-node的ready是0。
calico/node is not ready: BIRD is not ready
解决过程:
https://blog.csdn.net/qq_26993175/article/details/125541570
验证pod工作。验证pod网络通信。验证DNS解析。
在k8s集群中,创建一个pod,验证是否正常运行。
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
6、安装dashboard,只在master节点安装。
下载yaml文件。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml --no-check-certificate
下载之后,在spec节点增加访问类型:type: NodePort。
声明通过nodeport方式来访问dashboard。
同时指定暴露端口为:30000
应用yaml文件
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
#查看svc命名空间下的
kubectl get pods,svc -n kubernetes-dashboard
替换重启指令,用于yaml文件有更新的情况,会删除已经创建的pods
kubectl replace --force -f recommended.yaml
对外暴露端口为30000
https://192.168.1.15:30000
7、创建service account并绑定默认的cluster-admin管理员集群角色。
通过指令创建:
#创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
#为用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#获取用户的token用于登录
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret|awk '/dashboard-admin/{pring $1}')
找到创建的用户dashboard-admin节点,复制token作为登录依据:
通过yaml文件方式创建管理员,创建文件admin.yaml,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
kubectl create -f admin.yaml
由于有个pod状态不对,导致dashboard一直打不开
删除掉这个pod
kubectl delete pod web-96d5df5c8-l5vsw
kubectl replace --force -f recommended.yaml
可以看到,状态都正常了。
打开页面:
通过token登录,获取token见上面的方法
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret|awk '/dashboard-admin/{pring $1}')
找到
dashboard-admin-token相关节点的token,存储下来登录时候用
8、使用deployment控制器部署镜像。deployment用来部署无状态应用,管理pod,部署、滚动、升级。
kubectl create deployment web --image=nginx --replicas=1
kubectl get deploy,pods
查看日志:
kubectl logs name
使用service将pod暴露出去
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
kubectl get service
端口是随机生成的,通过get svc获取。
#查看service关联的pod
kubectl get endpoints
#修改副本数量
kubectl scale deployment web --replicas=5
升级示例:
#把已创建的名为web的pod,由nginx升级为nginx1.15,升级要有新的版本的镜像
kubectl set image deployment web nginx=nginx1.15
回滚示例
#查看历史版本:
kubectl rollout history deployment web
#还原到上一个版本:
kubectl rollout undo deployment web
#回滚到指定版本:
kubectl rollout history deployment web --to-revision=版本号
弹性伸缩:
kubectl scale deployment web --replicas=10
#10个副本
9、部署service
service的引入主要解决pod的动态变化,提供统一访问入口。可以防止pod失联(服务发现),定义一组pod的访问策略(负载均衡)。通过标签关联一组pod,为这一组pod提供负载均衡的能力。
当pod滚动升级的时候,可以及时让前端感知到。
创建一个简单service,通过yaml文件创建。
内部访问用yaml
apiVersion: v1
kind: Service # 资源类型
metadata: # 元数据,基本属性和信息
name: nginx # service 的名称
spec: # 这是关于描述
type: ClusterIP #服务类型,ClusterIP,集群内部访问用。NodePort,集群外部访问用
ports:
- port: 80 #service端口
protocol: TCP
targetPort: 80 #容器端口(应用程序监听端口)
selector: # 标签选择器
app: nginx
外部访问用yaml
apiVersion: v1
kind: Service # 资源类型
metadata: # 元数据,基本属性和信息
name: nginx # service 的名称
spec: # 这是关于描述
type: NodePort #在每个节点上启用一个端口,来暴露服务,集群外部访问用。也会分配一个稳定的集群内部IP。
ports:
- port: 80 #service端口
protocol: TCP
targetPort: 80 #容器端口(应用程序监听端口)
nodePort: 30001
selector: # 标签选择器
app: nginx
kubectl create -f nginx.yaml
#查看pods的标签
kubectl get pods --show-labels
kubectl get pods -o wide
#实时监控pods发现
kubectl get ep -w
#查看service关联的一组pod。通过标签选择器去关联
kubectl get ep
#查询default空间的所有serice
kubectl get service
由于不确定nginx这个service关联了哪些pods。导出yaml文件内容。通过如下指令查看关联的pods
kubectl get service nginx -o yaml
常用的services类型:
1.clusterIp:一般集群内部进行使用
2.nodePort:对外暴露应用时使用
3.loadBalance:对外访问应用使用,用于公有云