k8s_init_and_deploy_sample_service

文章目录
  1. 1. 初始化k8s
    1. 1.1. 一、准备
      1. 1.1.1. 1.1 常见问题
        1. 1.1.1.1. 1.1.1初始化失败
        2. 1.1.1.2. 1.1.2kubectl get pod
    2. 1.2. 二、kuboard安装
      1. 1.2.1. 三、使用kubectl来创建pod并部署
        1. 1.2.1.1. 3.1. 创建nginx镜像
        2. 1.2.1.2. 3.2. 部署nginx
        3. 1.2.1.3. 3.3. nginx端口暴露能被外部访问
        4. 1.2.1.4. 3.4. 查看pod的信息
        5. 1.2.1.5. 配置文件来部署
        6. 1.2.1.6. 3.5常见问题
          1. 1.2.1.6.1. 3.5.1 k8s某个节点挂掉
            1. 1.2.1.6.1.1. 查看日志的命令如下
            2. 1.2.1.6.1.2. 查看节点命令如下
            3. 1.2.1.6.1.3. 重启kubelet的服务
            4. 1.2.1.6.1.4. 查看端口的连接情况
            5. 1.2.1.6.1.5. 使用的是sealons重新添加该集群
          2. 1.2.1.6.2. 3.5.2 容器运行时报错Network plugin returns error
    3. 1.3. 四、部署minio和创建volumeclass
      1. 1.3.1. 4.1使用krew初始化minio

初始化k8s

我了解有下列一键部署k8s,第一个是网友推荐,第二个是kuboard上面推荐

目前使用 sealos来一键初始化kubernetes环境

一、准备

  • hostname不能重名
  • 服务过程中会自动关闭防火墙
  • 需要保证节点服务的可访问
  • 默认使用containerd而不是docker为容器平台
1
2
3
4
5
6
7
8
9
10
11
12
13
# 下载并安装sealos, sealos是个golang的二进制工具,直接下载拷贝到bin目录即可, release页面也可下载
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos && \
chmod +x sealos && mv sealos /usr/bin

# 下载离线资源包
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/05a3db657821277f5f3b92d834bbaf98-v1.22.0/kube1.22.0.tar.gz

# 安装一个三master的kubernetes集群
sealos init --passwd '123456' \
--master 192.168.0.2 --master 192.168.0.3 --master 192.168.0.4 \
--node 192.168.0.5 \
--pkg-url /root/kube1.22.0.tar.gz \
--version v1.22.0

1.1 常见问题

1.1.1初始化失败

现象如下:

generator kubeconfig failed couldn’t create a kubeconfig

container runtime is not running: output

解决方法: 不用安装docker和其他服务,服务器只需要wget 服务

1.1.2kubectl get pod

The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决方法: 将主节点的 admin.conf 拷到对应节点后配置环境变量

1
2
3
4
5
6
7
scp  /etc/kubernetes/admin.conf  192.168.31.133:/etc/kubernetes

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source ~/.bash_profile

kubectl get pods

k8s集群部分常见问题处理 - 云+社区 - 腾讯云

二、kuboard安装

在 K8S 中安装 Kuboard v3 | Kuboard

我选择使用 hostPath 提供持久化而不是 StorageClass 提供持久化(还没有创建)

界面如下

image-20220127150651513

三、使用kubectl来创建pod并部署

命令来创建,部署

注意kubectl 需要指定namespace的值,否则默认是default

kubectl get pod No resources found in default namespace.

3.1. 创建nginx镜像

kubectl run nginx –image=nginx –port=80

NAME READY STATUS RESTARTS AGE

nginx 1/1 Running 0 83s

3.2. 部署nginx

kubectl create deployment nginx –image=nginx

deployment.apps/nginx created

否则 运行下面命令会出现没有部署服务

kubectl get deployment

No resources found in default namespace.

3.3. nginx端口暴露能被外部访问

kubectl expose deployment nginx –port=80 –type=LoadBalancer

3.4. 查看pod的信息

kubectl describe service nginx

Name: nginx
Namespace: default
Labels: app=nginx
Annotations:
Selector: app=nginx
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.109.244.210
IPs: 10.109.244.210
Port: 80/TCP
TargetPort: 80/TCP
NodePort: 30682/TCP
Endpoints: 100.118.167.130:80
Session Affinity: None
External Traffic Policy: Cluster
Events:

kubectl get pods –all-namespaces

配置文件来部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-node
namespace: default
labels:
app: hello-node
spec:
replicas: 3
selector:
matchLabels:
app: hello-node
template:
metadata:
labels:
app: hello-node
spec:
containers:
- name: hello-node-container
image: gcr.io/$DEVSHELL_PROJECT_ID/hello-node:1.0
ports:
- containerPort: 8080

kubectl apply -f nginx-deployment.yaml

3.5常见问题

3.5.1 k8s某个节点挂掉

如果遇到k8s某个节点挂掉,但是服务器还是可以连接的情况,说明是服务器节点通信问题,首先参考下面的连接查看日志和对应端口是否是正常的

服务器重启后kubernetes无法启动的原因 - 数据库敲门人

The connection to the server :6443 was refused - did you specify the right host or port? - General Discussions - Discuss Kubernetes

查看日志的命令如下

journalctl -u kubelet.service

journalctl -xefu kubelet

查看节点命令如下

kubectl get node –watch

重启kubelet的服务

systemctl restart kubelet

查看端口的连接情况

netstat -nap|grep 6443
The connection to the server apiserver.cluster.local:6443 was refused - did you specify the right host or port?

使用的是sealons重新添加该集群

建议可以使用 sealos delete 删除掉线的节点

然后再使用 sealos join 命令能把节点重新加入到集群中

3.5.2 容器运行时报错Network plugin returns error

日志如下

cat /var/log/pods/kube-system_kube-apiserver-master2_d653fc9e62a54eaa54def1ae5c0dde56/kube-apiserver

container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

首先查看kube-system中NetworkPlugin是否存在

kubectl get pod -n kube-system

k8s中存在网络插件一般包括**Choose network plugin (cilium, calico, contiv, weave or flannel)**,我看着初始化的是calico

同时查看对应calico的日志

kubectl logs calico-node-rkqkq –namespace=kube-system

kubectl get pods -o wide -A

查看对应的配置信息

kubectl describe pod calico-node-rkqkq –namespace=kube-system

配置文件存放地址 /root/kube/conf/calico.yaml

下面推荐的解决方案:

k8s join集群时报错Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: - 丛丛丛丛 - 博客园

kubeadm - Calico: Kubernetes pods can’t ping each other use Cluster IP - Stack Overflow
kubectl delete-f /etc/kubernetes/addons/calico.yaml

kubenates启动calico-node时,有节点总是报错CrashLoopBackOff_dkgee-CSDN博客

四、部署minio和创建volumeclass

根据官方文档可以找到

Deploy MinIO Operator on Kubernetes — MinIO Hybrid Cloud Documentation

operator/README.md at master · minio/operator

需要 Installing · Krew或者minio/helm/minio at master )包管理软件

4.1使用krew初始化minio

我选择krew包管理,需要使用到git命令

然后运行下面这段内容

1
2
3
4
5
6
7
8
9
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)

运行过程中出了问题 变量${KREW}=krew-linux_amd64

我是下载 https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-linux_amd64.tar.gz、

export PATH=”$HOME/.krew}/bin:$PATH”

目前使用kuboard web界面管理k8s集群

存储类StorageClass | Kuboard但是目前只支持界面配置 cephfs,nfs

Storage Classes | Kubernetes 官方支持的volumeclass也没有minio需要手写 yml的配置文件