【最全Kubernetes容器编排安装教程】(四)

简介: 【最全Kubernetes容器编排安装教程】

安装kubernetes

添加kubernetes源

在master节点上添加k8s软件源,并分发到其他两台机器上。在/etc/yum.repos.d/目录下新增kubernetes.repo。内容如下:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

把kubernetes.repo文件分发到其他两台机器上,执行如下命令:

ansible k8s -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"

安装

在master节点下执行如下命令安装相应的软件:

yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3

生成默认配置并修改相应的参数,通过如下命名生成一个默认的配置文件:

kubeadm config print init-defaults > kubeadm-init.yaml

根据自己的环境修改对应的参数:

# api版本是kubeadm.k8s.io/v1beta3
apiVersion: kubeadm.k8s.io/v1beta3
# 引导令牌
bootstrapTokens:
  - groups:
      - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef  # 令牌
    ttl: 24h0m0s  # 过期时间为 24 小时
    usages:
      - signing  # 用于签名
      - authentication  # 用于认证
# 初始化配置
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.122.130  #master节点IP
  bindPort: 6443  # 绑定端口
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock  # containerd 的 socket 文件地址
  imagePullPolicy: IfNotPresent  # 镜像拉取策略为 IfNotPresent
  name: k8s-master # 节点名称
  taints: null  # 污点为空
# 集群配置
apiServer:
  timeoutForControlPlane: 4m0s  # 控制平面的超时时间为 4 分钟
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki  # 证书目录
clusterName: kubernetes  # 集群名称
controllerManager: {}  # 控制器管理器
dns: {}  # dns
etcd:
  local:
    dataDir: /var/lib/etcd  # etcd 数据目录
imageRepository: registry.aliyuncs.com/google_containers  #阿里云容器源地址
kind: ClusterConfiguration
kubernetesVersion: 1.24.0  # kubernetes 版本
networking:
  dnsDomain: cluster.local  # dns 域名
  podSubnet: 10.244.0.0/16  #pod的IP网段
  serviceSubnet: 10.96.0.0/12  # 服务子网
scheduler: {}  # 调度器

初始化

执行如下命令进行初始化:

kubeadm init --config=kubeadm-init.yaml   --v=6

–config:指定根据那个配置文件进行初始

–v:指定日志级别,越高越详细

按照初始化成功提示信息,做如下操作:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

接下来执行kubectl就可以看到node了

kubectl get node

查看k8s各部件启动情况,执行如下命令:

kubectl get pod --all-namespaces -o wide

node节点配置

node节点安装kubeadm

cat <<EOF > /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.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装相关组件

yum install -y kubeadm-1.24.3 --disableexcludes=kubernetes

添加join命令

kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d

如果我们后续需要添加node节点时,可以到master节点执行下面的命令获取token相关信息

kubeadm token create --print-join-command

如果添加某台节点异常了,修改后可以执行 kubeadm reset的命令,然后在重新join加入

网络配置

coredns还没启动,因为还没有安装网络插件,接下来安装网络插件,可以在该文档中选择我们自己的网络插件,这里安装flannel

wget http://down.i4t.com/k8s1.24/kube-flannel.yml

根据需求修改网卡配置,我这里ens33为主的:

containers:
- name: kube-flannel
 image: quay.io/coreos/flannel:v0.12.0-amd64
 command:
 - /opt/bin/flanneld
 args:
 - --ip-masq
 - --kube-subnet-mgr
 - --iface=ens33  # 如果是多网卡的话,指定内网网卡的名称

在kubeadm.yaml文件中设置了podSubnet网段,同时在flannel中网段也要设置相同的。 (我这里默认就是相同的配置)

执行部署

kubectl apply -f kube-flannel.yml

CNI插件问题

默认情况下containerd也会有一个cni插件,但是我们已经安装Flannel了,我们需要使用Flannel的cni插件,需要将containerd里面的cni配置文件进行注释,否则2个配置会产生冲突 。因为如果这个目录中有多个 cni 配置文件,kubelet 将会使用按文件名的字典顺序排列的第一个作为配置文件,所以前面默认选择使用的是 containerd-net 这个插件。

mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
systemctl restart containerd kubelet

验证

验证dns是否正常能解析和pod之间。这里新建一个测试的yaml文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: abcdocker9/centos:v1
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

执行下面命令,创建pod

kubectl apply -f test.yaml

使用nslookup查看是否能返回地址

kubectl exec -it busybox -- nslookup kubernetes

测试nginx svc以及Pod内部网络通信是否正常 ,分别在三台机器上进行下面操作

ping 10.104.115.26 #nginx svc ip
ping 10.244.1.2 #podIP

如果成功ping同说明node跟pod的网络已经打通了。否则检查kube-proxy的模式是否正确。

nodes/集群内部 无法访问ClusterIP

默认情况下,我们部署的kube-proxy通过查看日志,能看到如下信息:Flag proxy-mode="" unknown,assuming iptables proxy

原因分析:

并没有正确使用ipvs模式

解决方法:

在master上修改kube-proxy的配置文件,添加mode为ipvs。

kubectl edit cm kube-proxy -n kube-system
kubectl edit cm kube-proxy -n kube-system

删除原来的POD,会自动重启kube-proxy 的pod

kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

扩展

在使用过程中发现kubectl 命令不能补全,使用起来很不方便。为了提高使用kubectl命令工具的便捷性,介绍一下kubectl命令补全工具的安装。

1、安装bash-completion:

yum install -y bash-completion 
source /usr/share/bash-completion/bash_completion

2、 应用kubectl的completion到系统环境:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1天前
|
存储 运维 Kubernetes
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】
|
1天前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm了解两者特点,助力选取合适容器编排工具
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。
|
11小时前
|
存储 Java Serverless
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
ACK One Argo 工作流集群:玩转容器对象存储
|
1天前
|
分布式计算 Kubernetes 监控
容器服务Kubernetes版产品使用合集之怎么实现把 spark 跑在k8s
容器服务Kubernetes版,作为阿里云提供的核心服务之一,旨在帮助企业及开发者高效管理和运行Kubernetes集群,实现应用的容器化与微服务化。以下是关于使用这些服务的一些建议和合集,涵盖基本操作、最佳实践、以及一些高级功能的使用方法。
18 1
|
1天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
19 0
|
1天前
|
Kubernetes API 调度
|
1天前
|
运维 Kubernetes Linux
10分钟搭建Kubernetes容器集群平台(kubeadm)
10分钟搭建Kubernetes容器集群平台(kubeadm)
|
1天前
|
Kubernetes Ubuntu Linux
Kubernetes(K8S)集群管理Docker容器(部署篇)
Kubernetes(K8S)集群管理Docker容器(部署篇)
|
1天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
1天前
|
Kubernetes Shell 网络安全
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统