kubernetes1.20.0 和 + 使用crio1.20.0部署到ubuntu18.04

ubuntu18.04安装 kubernetes1.20.0+crio1.20.0部署,此处为安转的一个实验节点,集群安装请参考集群前期准备iptables,ipvs

官网链接

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#cri-o

1、安装以及配置的先决条件:

  • 配置主机名 hostnamectl set-hostname my

  • 关闭交换空间
    swapoff -a
    注释 swap 开头的行
    vi /etc/fstab

  • 关闭防火墙
    ufw disable

  • 同步时间

dpkg-reconfigure tzdata
选择 Asia(亚洲)
选择 Shanghai(上海)
  • 安装 ntpdate
    apt-get update
    apt-get install ntpdate

  • 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器)
    ntpdate cn.pool.ntp.org

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

  • 配置静态网卡

vi /etc/netplan/50-cloud-init.yaml  
network:
    ethernets:
        ens33:
            dhcp4: false
            dhcp6: false
            addresses: [192.168.12.51/24]
            optional: true
            gateway4: 192.168.12.51
            nameservers:
                addresses: [192.168.12.1]
    version: 2
    
#保存刷新网卡, netplan apply
  • 修改hosts文件
cat >> /etc/hosts << EOF
192.168.12.51    my
EOF
  • iptables桥接流量
sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

2、安装cri-o cri-o-runc,这里选择ubuntu18.04为例,更多平台参考上面给出的链接

在下列操作系统上安装 CRI-O, 使用下表中合适的值设置环境变量 OS:

操作系统$OS
Ubuntu 20.04xUbuntu_20.04
Ubuntu 19.10xUbuntu_19.10
Ubuntu 19.04xUbuntu_19.04
Ubuntu 18.04xUbuntu_18.04

然后,将 $VERSION 设置为与你的 Kubernetes 相匹配的 CRI-O 版本。 例如,如果你要安装 CRI-O 1.18, 请设置 VERSION=1.18. 你也可以安装一个特定的发行版本。 例如要安装 1.18.3 版本,设置 VERSION=1.18:1.18.3 。

注:目前只能下载1.20.0的crio和runc,1.20.1官网目前没资源

然后执行,

cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/ /
EOF

cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:1.20.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_18.04/ /
EOF

链接下载不了可手动在浏览器打开查看是否有资源,上面添加源也是如此
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04/Release.key | sudo apt-key add --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.20/xUbuntu_18.04/Release.key | sudo apt-key add --keyring /etc/apt/trusted.gpg.d/libcontainers-cri-o.gpg -


sudo apt-get update
sudo apt-get install cri-o cri-o-runc

安装crictl 1.20.0工具,具备docker基本一些命令

github地址:https://github.com/kubernetes-sigs/cri-tools,
下载1.20.0版本
https://github.com/kubernetes-sigs/cri-tools/releases

删除安装crio自带的crictl工具,目录为 cd /usr/bin/crictl,解压新版本放入到 /usr/bin/  即可

验证 crictl -version
输出如下
root@my:~# crictl -version
crictl version v1.20.0

验证  crictl --runtime-endpoint unix:///var/run/crio/crio.sock version
输出如下
Version:  0.1.0
RuntimeName:  cri-o
RuntimeVersion:  1.20.0
RuntimeApiVersion:  v1alpha1

crictl配置crio运行时路径,默认已存在配置,如没有可增加

vi /etc/crictl.yaml
内容如下
runtime-endpoint: "unix:///var/run/crio/crio.sock"
image-endpoint: "unix:///var/run/crio/crio.sock"
timeout: 0
debug: false
pull-image-on-create: true
disable-pull-on-run: false

配置crio默认拉取镜像地址

vi /etc/crio/crio.conf

1、搜索内容 /registry ,放开下面注释加入内容,此为阿里云用户容器加速链接,可自行申请
注:目前发现不支持协议前缀https,改成abc.com:443
注:阿里云仓库需要增加/library
registries = ['4v2510z7.mirror.aliyuncs.com:443/library']
或者
registries = [
  '4v2510z7.mirror.aliyuncs.com/' , 'docker.io'
]

2、搜索内容 /pause_image 
pause_image = "registry.aliyuncs.com/google_containers/pause:3.2"

启动 CRI-O:

sudo systemctl daemon-reload
sudo systemctl start crio
sudo systemctl restart crio  #重启

3、安装kubeadm、kubectl、kbelet

安装 kubeadm,kubelet,kubectl
安装系统工具
apt-get update && apt-get install -y apt-transport-https
安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
写入软件源;文件不存在新建
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
> deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
> EOF
更新数据源
apt-get update
安装k8s指定版本号
apt-get install -y kubelet=1.20.0-00 kubeadm=1.20.0-00 kubectl=1.20.0-00

4、导出kubeadm创建环境文件

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

需要修改内容已加注释如下

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  #当前节点ip或者hostname
  advertiseAddress: 192.168.8.51
  bindPort: 6443
nodeRegistration:
  #criSocket: unix:///var/run/dockershim.sock
  #重点修改为crio运行时
  criSocket: unix:///var/run/crio/crio.sock
  name: my
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
#配置阿里云k8s仓库
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
# 开启 IPVS 模式
#apiVersion: kubeproxy.config.k8s.io/v1alpha1
#kind: KubeProxyConfiguration
#featureGates:
        #  SupportIPVSProxyMode: true
 #mode: ipvs

查看所需镜像列表

kubeadm config images list --config kubeadm.yml

拉取镜像

kubeadm config images pull --config kubeadm.yml

5、根据配置文件启动kubeadm拉起k8s

--v=6 查看日志级别,一个节点可以忽略该参数 --upload-certs
kubeadm init --config=./kubeadm.yml --upload-certs --v=6

6、配置 kubectl

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

7、验证是否成功

kubectl get node

输出如下
root@my:/usr/local/kubernetes# kubectl get node
NAME   STATUS   ROLES                  AGE   VERSION
my     Ready    control-plane,master   17m   v1.20.0

8、查看kubectl get cs状态

root@my:/usr/local/kubernetes# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}  

注:可能遇到检查状态不ok,编辑如下路径配置
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml
把这一行内容注释,等待集群自动加载配置,需要时间
#    - --port=0                  ## 注释掉这行

让我们回顾下启动kubeadm的日志,其中有一段如下,即状态检查错误产生的原因
I0112 11:16:30.608300   57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s  in 0 milliseconds
I0112 11:16:35.933347   57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s 500 Internal Server Error in 4825 milliseconds
I0112 11:16:36.157573   57110 round_trippers.go:445] GET https://192.168.8.51:6443/healthz?timeout=10s 500 Internal Server Error in 49 milliseconds

9、驱逐master污点,让master具有可调度pod到master节点上运行

root@my:/# kubectl taint nodes --all node-role.kubernetes.io/master-

输出如下
node/my untainted

10、部署nginx验证k8s是否可用

#对应应用的期望是什么
apiVersion: apps/v1
#资源类型为控制器类型
kind: Deployment
#元数据
metadata:
  #应用名称
  name: myapp
  #所在命名空间
  namespace: default
  #应用标签,可组合多个
  labels:
    app: myapp
#对应应用的期望是什么
spec:
  #副本数为2
  replicas: 1
  #设置滚动升级保存多少个历史revision版本
  revisionHistoryLimit: 3
  #标签选择器-如何让应用于pod关联:myapp通过查找app: myapp的标签pod然后查找容器app: myapp进行关联
  selector:
    #通过标签匹配
    matchLabels:
      #供selector选择,保持一致(deployment通过该label找到pod)
      app: myapp
  #POD使用模板
  template:
    #pod的标签
    metadata:
      labels:
        app: myapp
    #pod中所包含的容器
    spec:
      #容器列表
      containers:
      #容器信息:名称、使用镜像、拉取策略
      - name: myapp
        image: nginx
        #实际生产过程中,我们希望每次都去重新下载:Always、Nerver
        imagePullPolicy: IfNotPresent
        #容器内部端口
        ports:
        - containerPort: 80
        resources:
          #指定容器请求
          requests:
            memory: "1000Mi"
            cpu: "500m"
          #指定容器限制
          limits:
            memory: "1000Mi"
            cpu: "500m"
---
#注册服务
#API 版本号
apiVersion: v1
kind: Service
#元数据
metadata:
  #Kind 的名称
  name: myapp
  labels:
    app: myapp
spec:
  #暴露端口
  ports:
      #Service 暴露的端口
    - port: 80
      #Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上
      targetPort: 80
      #node暴露端口范围:30000-32767
      nodePort: 30001
  #类型的ClusterIP,LoadBalancer,none(无头服务)
  #type: LoadBalancer
  type: NodePort
  # 标签选择器
  selector:
    # 需要和上面部署的label app=myapp Deployment 标签名对应
    app: myapp

使用ip:30001访问,可以看到nginx欢迎页即成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值