Kubernetes快速开始

在这里插入图片描述
中文官网:https://kubernetes.io/zh/

目标与简介

0:目标

使用 kind 快速部署本地 kubernetes 集群,在 kubernetes 集群上运行 demo web 程序,并配置 https 安全访问 web 程序。

1:kubernetes

kubernetes 是一种可自动实施 linux 容器操作的开源平台。可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,用户可以将运行 linux 容器的多组主机聚集在一起,使用 Kubernetes 轻松高效地管理这些集群。而且这些集群可跨公共云、私有云或混合云部署主机。对于要求快速扩展的云原生应用而言,Kubernetes 是理想的托管平台。kubernetes 具有自动化上线和回滚、服务发现与负载均衡、存储编排、Secret 和配置管理、自动装箱、批量执行、IPv4/IPv6 双协议栈、水平扩缩、自我修复和为扩展性设计等诸多特性。

2:docker

docker 属于 linux 容器的一种封装,提供简单易用的容器使用接口。是目前流行的 linux 容器解决方案。docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 docker,就不用担心环境问题。docker 的接口也相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。

3:kind

kind 是 kubernetes in docker 的简写,是一种使用 docker 容器运行本地 kubernetes 集群的工具。kind 主要用于测试 kubernetes 本身,但也可用于本地开发或 CI。为什么选择kind作为部署工具?原因有以下几点:kind 支持多节点(包括 HA)集群;kind 支持从源代码构建 kubernetes 发布版本,除了预先发布的构建之外,还支持 make / bash 或 docker;kind 支持 linux、macos 和 windows;kind 是CNCF 认证符合的 kubernetes 安装程序。

软件系统版本
LinuxCentOS Linux release 7.4.1708 (Core) 3.10.0-693.el7.x86_64 2C4G
Java1.8.0_301 Java™ SE Runtime Environment (build 1.8.0_301-b09)
Docker20.10.8, build 3967b7d
Kindv0.11.1 go1.16.4 linux/amd64
Kubectlv1.22.1
Kubernetesv1.21.1
关闭防火墙、Swap、SELinux

开始部署 kubernetes 前,我们需要做一些准备工作,关闭系统防火墙、系统 Swap 分区和 Linux 安全子系统 SELinux,这三者也可以不关闭,但是为了避免遇到一些神奇的问题,建议关闭,关闭指令如下

0:关闭防火墙

# 禁用防火墙服务
systemctl disable firewalld

# 停止防火墙服务
systemctl stop firewalld

# 查看防火墙状态
systemctl status firewalld

1:关闭Swap

# 将/etc/fstab文件中所有设置为swap的设备关闭
swapoff -a

# 永久关闭
echo "vm.swappiness=0" >> /etc/sysctl.conf

# 立即生效
sysctl -p /etc/sysctl.conf

# 修改/etc/fstab永久关闭 Swap
sed -i 's$/dev/mapper/centos-swap$#/dev/mapper/centos-swap$g' /etc/fstab

# 查看
free -m

2:关闭SELinux

# 查看SELinux当前模式。宽容模式(permissive)、强制模式(enforcing)、关闭(disabled)
getenforce

# 编辑配置文件
vi /etc/selinux/config

# 修改模式为关闭,保存后需重启系统
SELINUX=disabled
安装wegt

已安装请跳过。wget是一个下载文件的工具

yum -y install wget
部署jdk、docker

kind 是将 kubernetes 运行在 docker 容器中的,因此要依赖 docker 环境,下面是安装 jdk 和 docker 环境的详细过程。

0:部署jdk

在这里插入图片描述
下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

在官网下载 jdk8 压缩包 jdk-8u301-linux-x64.tar.gz,本文使用的是 8u301 版本,也可以自行选择版本进行下载安装,安装 jdk 的过程很简单,只需解压并配置环境变量即可,指令如下

# 创建安装目录,并将jdk压缩包解压至该目录
mkdir /usr/java/ && cd /usr/java/
cp /root/jdk-8u301-linux-x64.tar.gz /usr/java/
tar -zxvf jdk-8u301-linux-x64.tar.gz

# 编辑环境变量配置文件
vi /etc/profile

# 将以下内容添加至配置文件末尾
export JAVA_HOME=/usr/java/jdk1.8.0_301
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

# 刷新环境变量
source /etc/profile

# 查看jdk版本
java -version

1:部署docker

在这里插入图片描述
官网地址:https://www.docker.com/

部署 docker 后我们需要配置一些国内的镜像源,解决国内镜像拉取速度慢的问题,部署 docker 指令及过程如下

# 安装yum工具包
yum install -y yum-utils

# 配置yum repo源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 生成缓存,提升搜索安装软件的速度
yum makecache fast

# 安装docker
yum install -y docker-ce

# 设置开机自启并启动docker服务
systemctl enable docker && systemctl start docker

# 查看服务状态
systemctl status docker

# 配置镜像加速源地址
cat > /etc/docker/daemon.json <<EOF                            
{                                                                                                                            
  "registry-mirrors": [
    "https://etreoc7n.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://cr.console.aliyun.com/"
  ]                                          
}                                                                                                                            
EOF

# 重启docker服务
systemctl restart docker
部署kubectl

kubectl 是 Kubernetes 的命令行工具,通过它与 Kubernetes 进行交互。通过 kubectl 能够对集群本身进行管理,并且可以在集群上进行容器化应用的安装与部署。

官方文档:https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux/

安装指令如下

# 下载最新发行版
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# 安装kubectl
install kubectl /usr/local/bin/kubectl

# 查看版本
kubectl version --client
部署kind

在这里插入图片描述
官网地址:https://kind.sigs.k8s.io/

开源地址:https://github.com/kubernetes-sigs/kind/

Kind 目前版本更新至0.11.1,本文以 0.11.1 版本安装部署为例,指令如下

# 下载最新v0.11.1版
curl -Lo ./kind "https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64"

# 设置执行权限
chmod +x ./kind

# 注册kind
mv ./kind /usr/local/bin/kind

# 查看版本
kind version
创建Kubernetes cluster

Kind 部署完成后,可以使用 kind 快速创建 kubernetes 集群,仅需要 kind create cluster 一句指令即可完成创建,下文以附加配置信息的形式创建一个名为 kind 的 kubernetes 集群

# 创建集群
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker
EOF

# 查看集群节点
kubectl get nodes

extraPortMappings:允许本地主机转发请求到 ingress controller 的 80/443 端口
node-labels:仅允许 ingress controller 运行在指定的接节点上

出现以下界面即表示 kebernetes 集群创建成功
在这里插入图片描述

部署ingress nginx

通常情况下 kubernetes 上运行的服务都是在自己的 pod 内部,外部网络无法访问到它们。我们可以通过创建 service 使容器供外部可见,这里外部可以是整个集群、也可以是整个互联网。

service 是一种用于在网络上公开 pod 的抽象机制,将流量路由到 pod 内的容器中。每个 service 都有一个类型,ClusterIP、NodePort、LoadBalancer 或 ExternalName等。这些类型定义了外部流量如何到达服务。

但是光有 service也不行 ,有时候我们需要将不同域名和 URL 路径上的流量路由到集群内部,这就需要用到 ingress 组件。

概念:https://kubernetes.io/docs/concepts/services-networking/ingress/

部署:https://kind.sigs.k8s.io/docs/user/ingress/

根据官网资料我们可以知道,ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。ingress 可以提供负载均衡、SSL 终端和基于名称的虚拟主机。

为了让 ingress 资源工作,集群中必须有一个正在运行的 ingress controller。Kubernetes项目目前支持维护 AWS, GCE 和 nginx ingress控制器

Kubernetes as a project supports and maintains AWS, GCE, and nginx ingress controllers.

有以下几种 ingress controller 可供选择,Ambassador、Contour 和 Ingress NGINX,这里我们选择官方维护的方案 Ingress NGINX

部署 ingress nginx 时有两个镜像需要从谷歌镜像仓库拉取,但是国内网络拉取的时候有障碍,所以需要修改下部署 yaml 文件中的镜像,大家可以直接改成我的阿里云镜像,权限是可以公开拉取,也可以参考以下文章,将镜像推送至自己的阿里云仓库或者私有仓库

文章地址:https://blog.csdn.net/momo57l/article/details/120263957

部署 ingress nginx 的指令如下

# 下载官方资源定义yaml文件
wget -O kind-ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

# 修改yaml文件中的镜像地址,将以下两个镜像分别替换成对应的阿里云镜像,注意有三处需要替换
# k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6
# k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068
vi kind-ingress-nginx.yaml

registry.cn-hangzhou.aliyuncs.com/liuuuu/ingress-nginx-controller:v1.0.0
registry.cn-hangzhou.aliyuncs.com/liuuuu/ingress-nginx-kube-webhook-certgen:v1.0

# 部署资源
kubectl apply -f kind-ingress-nginx.yaml

# 查看资源部署情况
kubectl get po,svc -n ingress-nginx
部署dashboard

不需要的请跳过。未部署 dashboard 对 kubernetes 的正常使用没有任何影响

官网:https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/

# 下载官方yaml文件
wget -O kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

# 部署dashboard
kubectl apply -f kubernetes-dashboard.yaml

# 查看各组件状态
kubectl get po,svc -n kubernetes-dashboard

# 测试是否部署成功,使用kubectl proxy暴露端口,让外部访问到dashboard
kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$'

通过以下链接访问到 dashboard,ip 替换为 linux 虚拟机 ip 地址:

http://ip:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

在这里插入图片描述
此时 dashboard 是无法登陆的,需要配置 https 进行安全访问,下文将会使用之前部署的 ingress nginx 进行配置访问

配置dashboard ingress

不需要的请跳过。配置 https 安全访问需要准备一个域名和对应的有效 SSL 证书

通过 ingress nginx 访问 dashboard,使用域名并配置 https 安全访问。在 ingress 中不能直接使用 SSL 证书,需要转换为 tls secret 才能使用,这里以 kd.liuuuu.com 域名为例,将对应的 SSL 证书上传至 linux 虚拟机后执行以下操作

# 从给定的公私钥对创建TLS secret
kubectl create secret tls dashboard-ingress-tls --key kd.liuuuu.com.key --cert kd.liuuuu.com.crt -n kubernetes-dashboard

# 查看secret
kubectl get secret dashboard-ingress-tls -n kubernetes-dashboard -o yaml

# 创建yaml文件
touch dashboard-ingress.yaml && vi dashboard-ingress.yaml

# 文件内容
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  tls:
  - secretName: dashboard-ingress-tls
  rules:
    - host: kd.liuuuu.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: kubernetes-dashboard
              port:
                number: 443

# 部署资源
kubectl apply -f dashboard-ingress.yaml

# 查看ingress资源
kubectl describe ingress -n kubernetes-dashboard

此时便不需要使用 kubectl proxy 暴露服务,直接通过域名即可访问到dashboard:https://kd.liuuuu.com/
登陆 dashboard 需要用到授权 token,创建 Kubernetes Dashboard Bearer Token,用于访问 dashboard

# 创建admin用户
kubectl create clusterrolebinding default-admin --clusterrole cluster-admin --serviceaccount=default:default

# 生成token
token=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)

# 保存并查看token
echo $token > dashboard-token.txt && cat dashboard-token.txt

通过该授权 token 即可登陆进入 dashboard 控制台

在这里插入图片描述

使用kubernetes

创建一个 demo web 项目,并将项目打包成 docker 镜像,上传至阿里云镜像仓库。Demo 项目是一个很简单的 web 项目,启动后访问项目根路径,会返回“Hello Kubernetes !”

参考文章:https://blog.csdn.net/momo57l/article/details/120080394

项目地址:https://gitee.com/liujiazhongg_admin/demo-docker-image

当我们把项目打包成镜像推送至阿里云镜像仓库后,就可以使用 kubernetes 完成对项目的部署,下面是详细部署过程,部署完成后使用域名并配置 https 安全访问到 web 项目,此处以 demo.liuuuu.com域名为例

# 创建命名空间
kubectl create namespace kube-demo

# 上传公私钥文件,创建TLS secret
kubectl create secret tls demo-server-ingress-tls --key demo.liuuuu.com.key --cert demo.liuuuu.com.crt -n kube-demo

# 创建并编辑demo资源部署yaml文件
touch kubernetes-demo.yaml && vi kubernetes-demo.yaml

# 文件内容
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-demo-server-ingress
  namespace: kube-demo
  annotations:
    kubesphere.io/creator: liujiazhong
spec:
  tls:
  - secretName: demo-server-ingress-tls
  rules:
    - host: demo.liuuuu.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: demo-server-service
              port:
                number: 80

---

apiVersion: v1
kind: Service
metadata:
  name: demo-server-service
  namespace: kube-demo
  labels:
    app: demo-server
  annotations:
    kubesphere.io/creator: liujiazhong
    kubesphere.io/description: deme-server
    kubesphere.io/serviceType: statelessservice
spec:
  type: NodePort
  ports:
    - port: 80
      name: http
      protocol: TCP
      targetPort: 8085
  selector:
    app: demo-server

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-server-deployment
  namespace: kube-demo
  labels:
    app: demo-server
  annotations:
    deployment.kubernetes.io/revision: '1026'
    kubesphere.io/creator: liujiazhong
    kubesphere.io/description: demo-server
spec:
  replicas: 1
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
  selector:
    matchLabels:
      app: demo-server
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  template:
    metadata:
      labels:
        app: demo-server
    spec:
      containers:
        - name: demo-server
          image: registry.cn-hangzhou.aliyuncs.com/liuuuu/demo
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8085
              protocol: TCP
          livenessProbe:
            tcpSocket:
              port: 8085
            initialDelaySeconds: 60
            timeoutSeconds: 30
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            tcpSocket:
              port: 8085
            initialDelaySeconds: 60
            timeoutSeconds: 30
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          startupProbe:
            tcpSocket:
              port: 8085
            initialDelaySeconds: 60
            timeoutSeconds: 30
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
      restartPolicy: Always

# 部署资源
kubectl apply -f kubernetes-demo.yaml

# 查看资源部署状态
kubectl get po,svc -n kube-demo

此时访问 https://demo.liuuuu.com,即可访问到 demo web 项目

在这里插入图片描述

常用指令

kubectl

# 查看apiVersion列表
kubectl api-versions

# 创建命名空间
kubectl create namespace kube-demo

# 查看集群节点
kubectl get nodes

# 创建和删除资源
kubectl apply -f demo.yaml
kubectl delete-f demo.yaml

# 重新部署资源
kubectl replace --force -f name.yaml

# 删除pod
kubectl delete pod podname -n namespace

# 导出生成yaml文件
kubectl get secret demo-server-ingress-tls -n kube-demo -o yaml > demo-server-ingress-tls.yaml

kind

# 获取当前集群列表
kind get clusters

# 创建集群
kind create cluster --name kind

# 删除集群
kind delete cluster --name kind

openssl

# pem转crt
openssl x509 -in kd.liuuuu.com.pem -out kd.liuuuu.com.crt

centos7

# 查看系统版本
cat /etc/centos-release

# 查看内核版本
uname -r
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值