kubernetes 搭建初体验

Kubernetes安装前准备


概述

集群节点为 1主 2从模式,

  • OS:ubuntu server

  • CPU: 最低 1CPU 2 核

  • 内存:最低2G

  • 硬盘:最低20G

节点配置

主机名

IP

角色

系统

CPU/内存

磁盘

kubernetes-master

192.168.6.201

Mater

ubuntu

2核2G

20G

kubernetes-node-01

192.168.6.210

Node

ubuntu

2核4G

20G

kubernetes-node-02

192.168.6.211

Node

ubuntu

2核4G

20G

统一环境配置

安装完一台kubernetes服务器,直接用镜像

关闭交换空间

swapoff -a

永久禁用Swap
# 把根目录文件系统设为可读写
sudo mount -n -o remount,rw /
# 用vi修改/etc/fstab文件,在swap分区这行前加 # 禁用掉,保存退出
vi /etc/fstab
#swap.img

# 使用free -m查看分区状态
reboot
sudo free -m

避免开机启动交换空间

新版本可能没有

vi /etc/fatab
## 注释swap开头的行
#swap.img

关闭防火墙

ufw disable

配置DNS

vi /etc/systemd/resolved.conf
取消DNS注释行,并添加114.114.114.114
修改后重启计算机!!!

安装Docker

apt-get update
apt install docker.io

配置镜像加速器

vim /etc/docker/daemon.json

{
   "registry-mirrors": [
       "https://registry.docker-cn.com"
    ]
}

sudo systemctl daemon-reload
sudo systemctl restart docker.service

安装kubernetes必备工具

  • kubeadm:用来初始化集群的指令。

  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

  • kubectl:用来与集群通信的命令行工具。

# 安装系统工具
apt-get update && apt-get install -y apt-transport-https

# 因为kubernetes在国外,所以要使用aliyun 镜像
# 安装GPG 证书
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 

# 更新缓存索引
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" >>/etc/apt/sources.list.d/kubernetes.list

# 写入软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

#安装
sudo apt-get update
# sudo apt-get install -y kubelet kubeadm kubectl  //最新版本安装 1.26 有问题
#指定版本安装
apt-get install -y kubelet=1.25.0-00
apt-get install -y kubeadm=1.25.0-00
apt-get install -y kubectl=1.25.0-00
sudo apt-mark hold kubelet kubeadm kubectl

同步时间

  • 设置时区

dpkg-reconfigure tzdata
  • 选择Asia - Shanghai

#安装 nptdate
apt-get install ntpdate
# 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国公共的NTP 服务器)
ntpdate cn.pool.ntp.org

# 将系统时间写入硬件时间
hwclock --systohc
  • 确认时间

date

修改cloud.cfg

防止重启后主机名还原

vi /etc/cloud/cloud.cfg

preserver_hostname: true

修改主机名

hostnamectl set-hostname deployment

#配置 hosts

cat >> /etc/hosts  <<EOF
192.168.141.130 deployment
EOF

设置允许远程登陆root

vi /etc/ssh/sshd_config

# Authentication:
LoginGraceTime 120
#PermitRootLogin without-password    // 注释此行
PermitRootLogin  yes   // 加入此行
StrictModes yes

#PermitEmptyPasswords yes // 允许密码登陆


#重启服务
service ssh restart

修改ip地址

查看ip地址 ifconfig

查看网关 route -n

vi /etc/netplan/50-cloud-init.yaml  或者为00-installer-config.yaml

network:
    ethernets:
        ens33:
            addresses: [192.168.6.121/24]     // 24代表子网掩码 255.255.255.0  24个1
            gateway4: 192.168.6.1
            nameservers:
                addresses: [192.168.6.1]
                
                
network:
  ethernets:
    ens33:
      dhcp4: true
  version: 2    

gateway4 弃用

network:
   ethernets:
       ens33:
         addresses: [192.168.31.210/24]
         routes:
           - to: default
             via: 192.168.31.1
         nameservers:
           addresses: [192.168.31.1]

修改DNS

    # 取消DNS 注释行,并增加DNS配置如 114.114.114.114 并重启reboot
    vi /etc/systemd/resolved.conf

配置生效

sudo netplan apply

reboot

Kubernetes安装集群


kubeadm 安装集群

创建并修改配置

 cd /usr/local
 mkdir kubernetes
 mkdir cluster
 
 # 导出配置文件
 kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

更改

1.localAPIEndpoint:
    advertiseAddress: 192.168.6.110

2.imageRepository: registry.aliyuncs.com/google_containers // google上不去改成此地址

3.kubernetesVersion: v1.25.0   //改为具体版本

4.networking:
    dnsDomain: cluster.local
   #配置 POD 所在网段为虚拟机不重叠的网段(这里用的是Flannel 默认网段)
   podSubnet: "10.244.0.0/16"  //加入
   serviceSubnet: 10.96.0.0/12
scheduler: {}   

查看所需镜像

kubeadm config images list --config kubeadm.yml

拉取所需镜像

kubeadm config images pull --config kubeadm.yml

kubeadm.yml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.6.201
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}

安装主节点

用v1.25 没有大问题

如果安装kubernetes版本和下载的镜像版本不统一则会出现timeout waiting for the condition。可以通过kubeadm reset重置,然后再init

#初始化
kubeadm init --config=kubeadm.yml --experimental-upload-certs | tee kubeadm-init.log

1.16 以后版本新命令 
#输出token 到kubeadm-init.log
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
初始化完成后,还需要按照步骤运行操作

踩坑的点

安装过程可能出现kubeadm init初始化时dial tcp 127.0.0.1:10248: connect: connection refused

一定要记得 swapoff -a !!!!

vi /etc/docker/daemon.json
添加 
{"exec-opts": ["native.cgroupdriver=systemd"]}
 vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
 增加 --cgroup-driver=systemd 

systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
# 直到systemctl status kubelet.service 为active才行
sudo kubeadm reset

kubelet 起不起来问题

# 查看启动日志
journalctl -f -u kubelet

问题点:

1.k8s 版本确认 apt list --installed | grep kube 
2.开启docker-service systemctl enable docker.service
3.kubeadm.yml 配置文件的版本 由于阿里云镜像没有1.18.5 所有使用v1.18.0
4.内存够由2G 升为4G 需要重新配置交换空间 swapoff -a

安装从节点

从节点也必须安装好 kubelet 、 kubeadm、kubectl

从节点重置 kubeadm reset

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
    
##额外的初始化操作
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

## 部署网络
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

##从节点部署
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.6.201:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:192fbbefceb0c41b728ec932271710d44c3b9c79e5c571b94cdf59d41ccbb9f8

token 过期

# kubeadm token create
424mp7.nkxx07p940mkl2nd
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
d88fb55cb1bd659023b11e61052b39bbfe99842b0636574a16c76df186fd5e0d

kubeadm join 192.168.6.201:6443 --token 95jszr.4k2b04ugzrmuuj5o --discovery-token-ca-cert-hash sha256:9feb5bf152cea193e41ff0e6191b9fff8ca9b5b63a2bdafae64c79d71769c186

安装完主节点后,会有log提示如何安装从节点

另外服务器上运行即可

kubectl get nodes查看节点状态

NAME                 STATUS     ROLES           AGE    VERSION
kubernetes-node-01   NotReady   <none>          117m   v1.25.0
kubernetes-node-02   NotReady   <none>          114m   v1.25.0
node                 NotReady   control-plane   18h    v1.25.0
 
NotReady 是因为还没有配置网络

#后续添加节点生产token,复制粘贴直接可以追加节点
kubeadm token create --print-join-command


# 这个token有效期为1天,可以生产永久token

kubeadm token create --ttl 0

kubernetes配置网络


docker默认 为容器配置以下网络:

  • none

  • host

  • default bridge

  • 自定义网桥

CNI: 容器网络接口(Container Network Interface)

由Google和Core OS主导制定的容器网络标准,它仅仅是一个接口,具体的功能由各个网络插件自己去实现:

  • 创建容器网络空间(network namespace)

  • 将网络接口(interface)放到对应的网络空间

  • 为网络接口分配IP等

  • 容器删除时,回收网络资源

将所有的k8s Pod通过CNI 联系起来

CNI 插件

  • Flannel

  • Calico

  • Canal

  • Weave

安装网络插件Calico

Calico是一个开源网络和网络安全解决方案,适用于容器、虚拟机和基于本地主机的工作负载。Calico支持多种平台,包括Kubernetes、OpenShift、Mirantis Kubernetes Engine(MKE)、OpenStack和裸机服务。

无论您是选择使用Calico的eBPF数据平面还是使用Linux的标准网络管道,Calico都能提供超快的性能和真正的云本地可伸缩性。Calico为开发人员和群集运营商提供了一致的体验和功能集,无论它们是在公共云或本地运行、在单个节点上运行,还是在数千个节点的群集中运行。

官网:https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises

## dowload
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/calico.yaml -O
kubectl apply -f calico.yaml

###Confirm that all of the pods are running with the following command.
watch kubectl get pods -n calico-system

#确认状态
kubectl get node

kubernetes第一个容器


  • service 负责服务,应用的抽象

  • deployment 负责部署object(对象)

  • pod 允许容器的最小单元,类似于容器

检查组件运行状态

kubectl get cs

检查Master状态

kubectl cluster-info

检查Nodes状态

kubectl get nodes

运行第一个容器实例

--port=80 80端口在k8s的内网端口

# 使用kubectl 命令创建两个监听 80 端口 的Nginx Pod
(弃用)kubectl run nginx --image=nginx --replicas=2 --port=80

#1.8 之后弃用了replicas 推荐使用deployment创建pods
 # 先创建namespace
 kubectl create ns dev
 # 再启动
 kubectl create deployment nginx --image=nginx --port=80 --replicas=2
 # 默认会使用default namespace 如果起不来加上 -n dev
 
 显示 deployment.apps/nginx created

查看全部pods状态

kubectl get pods
kubectl get deployment

暴露服务

  • 部署完之后,还需要暴露出service 服务

  • 80 只是在k8s的内网的端口,还需要暴露服务,会生成30797 这种暴露在外的端口

  • expose 暴露一个 名叫nginx 的deployment,端口号80,类型 负载均衡

#启动 
kubectl expose deployment nginx --port=80 --type=LoadBalancer

查看已发布的服务

kubectl get service

查看服务详情

kubectl describe service nginx

验证是否成功

通过浏览器访问Node 节点服务器,负载均衡方式即为成功

http://192.168.6.210:31952/
http://192.168.6.211:31952/

停止服务

使用docker 并不能删除已开启的服务,因为高可用,会无限创建pods

  • 删除已部署的服务

kubectl delete deployment nginx
  • 删除已发布的服务

kubectl delete service nginx
  • 查看所有的部署

kubectl get deployment
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值