kubeadm部署k8s教程(2)---部署

一、部署k8s常用的两种方式
  1. kubeadm
    kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速不是k8s集群。学习成本低。后期维护,略微有些难度。
  2. 二进制
    通过官方下载rmp包来部署。需要自己部署各种组件。目前企业应用最多。

== 真正的生产环境采用那种方式部署呢?==

二、安装要求
  1. 一台或多台机器(1个master,多个node),操作系统 CentOS7.8。
  2. 节点硬件配置:至少2C2G,至少硬盘30GB或更多。
  3. 集群中所有机器之间网络互通。
  4. 可以访问外网,需要拉取镜像。
  5. 禁止swap分区。swapof
    kubeadm部署k8s教程(2)---部署_第1张图片
    kubeadm部署k8s教程(2)---部署_第2张图片kubeadm部署k8s教程(2)---部署_第3张图片
三、系统设置

本次规划两台机器:
192.168.129.15(master)(可修改配置允许master运行node)
192.168.130.41(node)

cat >> /etc/hosts< 192.168.129.15 k8s-master
192.168.130.41 k8s-node1
EOF

hostnamectl set-hostname k8s-master
bash
hostnamectl set-hostname k8s-node1
bash

三、本次任务,使用kubeadm快速部署一个k8s集群
  1. 安装docker
    请移步centos7 安装docker
  2. 创建一个Master节点
    kubeadm init
  3. 将一个Node节点加入到当前集群中
    kubeadm join
  4. 部署容器网络(CNI)
    kubectl apply -f calico.yaml
  5. 部署WebUI(Dashboard)
四、部署

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

kubeadm部署k8s教程(2)---部署_第4张图片g、启动etcd
h、上传配置文件、证书到k8s中。其他节点启动后会拉取配置文件进行启动。
i、给master标记污点。告诉k8s,新创建的容器不允许分配到此接点上。

执行成功后,会打印如下:
kubeadm部署k8s教程(2)---部署_第5张图片
执行提示的语句,将连接集群的配置文件,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网络
kubeadm部署k8s教程(2)---部署_第6张图片

在所有节点上执行
下载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

查看要安装的镜像
kubeadm部署k8s教程(2)---部署_第7张图片
部署之后,calico也会以容器的方式去启动.
安装完成后,查看pods。
kubectl get pods -n kube-system

kubeadm部署k8s教程(2)---部署_第8张图片
注意:
在后面重启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

kubeadm部署k8s教程(2)---部署_第9张图片

应用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 

kubeadm部署k8s教程(2)---部署_第10张图片kubeadm部署k8s教程(2)---部署_第11张图片

对外暴露端口为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作为登录依据:
kubeadm部署k8s教程(2)---部署_第12张图片

通过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一直打不开
kubeadm部署k8s教程(2)---部署_第13张图片删除掉这个pod

kubectl delete pod web-96d5df5c8-l5vsw

kubectl  replace --force -f recommended.yaml 

可以看到,状态都正常了。
在这里插入图片描述打开页面:
kubeadm部署k8s教程(2)---部署_第14张图片通过token登录,获取token见上面的方法

kubectl  describe secrets -n kube-system $(kubectl -n kube-system get secret|awk '/dashboard-admin/{pring $1}')

找到
dashboard-admin-token相关节点的token,存储下来登录时候用
kubeadm部署k8s教程(2)---部署_第15张图片

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滚动升级的时候,可以及时让前端感知到。
kubeadm部署k8s教程(2)---部署_第16张图片创建一个简单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

kubeadm部署k8s教程(2)---部署_第17张图片

常用的services类型:
1.clusterIp:一般集群内部进行使用
2.nodePort:对外暴露应用时使用
3.loadBalance:对外访问应用使用,用于公有云

你可能感兴趣的:(k8s,kubernetes,docker,java)