最近文章

kubernetes服务的版本回退

下面简单说一下kubernetes的版本回退,因为已经在线上使用挺久的时间了,是利用kubernetes deployment的rollout histrory回退到指定版本。 先给deployment打个样,webservice服务配置如下:kind: Deployment apiVersion: apps/v1beta2 metadata: name: pre-webservic
标签:

Kubernetes升级“艰难之路”【译】

首先,我们来定义Kubernete中hard-way的概念:Kubernetes的困难之处(hard way)是要学习和验证每一步,以确保了解步骤背后的内容及其反映。所以它不是你点击一下,就会有神奇事情发生的单一命令,它是一个漫长的路径,要一系列的命令才能够升级你的集群。好的一面是,第一次看起来很难,但之后,它将是你首选的升级方法,因为你会熟悉每个Kubernetes升级组件,以及你会使用大量命令
标签:

Python使用os.fork()创建子进程

导入os模块首先要导入os模块,如下:import os使用os.fork()创建进程使用fork创建一个新的进程后,新进程是原进程的子进程,原进程为父进程。如果发生错误,则会抛出OSError异常。-*- coding: utf-8 -*-import timeimport ostry: pid = os.fork()except OSError: passtime.sleep(20)
标签:

Python移除列表里重复的数据,并保留原来的次序

这有好几种方法实现。使用set实现def unique_everseen(items): seen = set() seen_add = seen.add return [x for x in items if not (x in seen or seen_add(x))]函数里把seen.add赋值给seen_add本地变量是出于性能考虑,因为seen会动态变化,如果直接在迭代
标签:

Python 3.5拼接列表的新语法

在Python 3.5之前的版本,拼接列表可以有这两种方法:1、列表相加list1 = [1,2,3] list2 = [4,5,6] result = list1 + list2 结果为一个新的列表2、在原来列表上扩展list1 = [1,2,3] list2 = [
标签:

Scrapy的安装:ImportError: No module named '_cffi_backend'

Scrapy安装时报错:ImportError: No module named '_cffi_backend'这个原因是没有安装cffi包。使用pip3安装cryptography和cffi。pip3 install cryptography pip3 install cffi
标签:

Python批量升级更新库包(pip和Anaconda)

pip批量更新库查看过期的库pip list --outdated  更新单一的库:pip install --upgrade 库名 批量升级更新所有过期的库import pip from subprocess import call for dist in pip.g
标签:

Python Pandas使用正则过滤dataframe里的列

Python Pandas可以在DataFrame.filter方法里使用正则来过滤列:创建DataFrameimport pandas as pd df = pd.DataFrame(np.array([[1,2,3],[2,3,4],[3,4,5]]),columns=['a','d1','d2']) >>  
标签:

kubernetes服务的版本回退

更新于 2023.03.13 17分钟阅读 0 评论 4 推荐

    Kubernets

    作者: Go.ai
  1. Kubernetes升级“艰难之路”【译】 Page 1
  2. kubernetes服务的版本回退 Page 15

下面简单说一下kubernetes的版本回退,因为已经在线上使用挺久的时间了,是利用kubernetes deployment的rollout histrory回退到指定版本。
 

先给deployment打个样,webservice服务配置如下:

kind: Deployment
apiVersion: apps/v1beta2
metadata:
  name: pre-webservice
  labels:
    k8s-app: pre-webservice
  annotations:
    kubernetes.io/change-cause: pre-201806291944-216d6afd
spec:
  replicas: 1
  revisionHistoryLimit: 5
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  selector:
    matchLabels:
      k8s-app: pre-webservice
  template:
    metadata:
      labels:
        k8s-app: pre-webservice
    spec:
      containers:
      - name: pre-webservice
        image: harbor.bbotte.com/service/webservice:pre-201806291944-216d6afd
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            memory: 2048Mi
        ports:
        - containerPort: 9080
        livenessProbe:
          tcpSocket:
            port: 9080
          initialDelaySeconds: 15
          periodSeconds: 20
        volumeMounts:
          - name: pre-webservice-data-storage
            mountPath: /opt
      imagePullSecrets:
        - name: harbor-auth
      volumes:
      - name: pre-webservice-data-storage
        persistentVolumeClaim:
          claimName: gfs
 
---
kind: Service
apiVersion: v1
metadata:
  name: pre-webservice-com
  labels:
    k8s-app: pre-webservice
spec:
  selector:
    k8s-app: pre-webservice
  ports:
  - port: 9080
    targetPort: 9080

revisionHistoryLimit控制保留几个版本信息。版本回退即把服务回滚回去,镜像的版本号为: gitlab分支-时间戳-git_commit_short

kubernetes.io/change-cause 信息为docker的版本号,以免不知道kubernetes发布的版本和镜像之间的关系,即images 最后面一段,这个是有模板创建的 yaml 配置文件,

部署的命令,需要加 –record=false

kubectl apply -f webservice.yaml --record=false

查看已发布的版本信息:

kubectl rollout history deploy/pre-webservice
deployments "pre-webservice"
REVISION  CHANGE-CAUSE
55        pre-201806281524-57a710e1
56        pre-201806281555-403c38aa
57        pre-201806281601-166ffb31
58        pre-201806291944-216d6afd

前面是k8s保留的版本号,后面是docker-image的版本号

回滚到指定版本,因为版本号是以gitlab分支-时间戳-git_commit_short命名,所以可以依据gitlab提交的版本或者时间来回退

kubectl rollout undo daemonset/webservice --to-revision=56

这样就回退到56的版本

Kubernetes升级“艰难之路”【译】

发布于 2022.03.09 14分钟阅读 0 评论 3 推荐

    Kubernets

    作者: Go.ai
  1. Kubernetes升级“艰难之路”【译】 Page 1
  2. kubernetes服务的版本回退 Page 15

首先,我们来定义Kubernete中hard-way的概念:

Kubernetes的困难之处(hard way)是要学习和验证每一步,以确保了解步骤背后的内容及其反映。所以它不是你点击一下,就会有神奇事情发生的单一命令,它是一个漫长的路径,要一系列的命令才能够升级你的集群。好的一面是,第一次看起来很难,但之后,它将是你首选的升级方法,因为你会熟悉每个Kubernetes升级组件,以及你会使用大量命令工具,帮助解决故障和提供你对集群更多的可控性,这会给你这方面积累经验。

现在我们跳到演示中,用双手操作命令行。演示将群集从版本1.22升级到1.23。要设置Kubernetes环境,你可以参考本文以获取快速,简单和干净的Kubernetes环境设置。

先决条件:

  • 确保备份所有重要组件,例如存储在数据库中的应用状态。 Kubernetes 升级不涉及正常的工作负载,只涉及与 Kubernetes 相关的组件,但备份始终是最佳实践。
  • 必须禁用Swap 

master节点升级步骤

@Master节点:

1. 排空主节点

驱逐/删除主节点下除镜像pod(这些是不能通过 API 服务器删除)外的所有的pod,以便能够执行升级。 如果有 daemon set-managed的pods,而没有设置--ignore-daemonsets ,drain就不会继续进行,因为这些 pods 将立即被 daemon set 控制器替换,它会忽略不可调度的标记

#kubectl drain master --ignore-daemonsetsnode/master already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-lfplf, kube-system/weave-net-fv7sn
evicting pod kube-system/coredns-64897985d-pl2v9
evicting pod kube-system/coredns-64897985d-65g5p
pod/coredns-64897985d-65g5p evicted
pod/coredns-64897985d-pl2v9 evicted
node/master drained

Draining 成功后,你可以检查节点的状态以确保它是 SchedulingDisabled,这表示该节点上不能调度任何 Pod。

#kubectl get nodes
NAME STATUS ROLES VERSION
master Ready,SchedulingDisabled control-plane,master v1.22.2
worker Ready <none> v1.22.2

2. 更新Ubuntu的包管理器,不同的操作系统可能会有所不同

#apt-get update

3、在包管理器中搜索可用的 kubeadm 包,并使用 grep 过滤出需要的版本。在我们的例子中是 1.23 版本。

#apt-cache show kubeadm | grep 1.23

输出应类似于以下内容:

Version: 1.23.1–00
Filename: pool/kubeadm_1.23.1–00_amd64_6bc970cf9bf5349ba18526f77c6ac16caf2a52b6a7b0e40753541ebef52ad99f.deb
Version: 1.23.0–00
Filename: pool/kubeadm_1.23.0–00_amd64_36016a07eb5c2bfae656cfee1b3848930757d201b474fea1cce1ecd507b94f0b.deb

4. 保留 kubectl 和 kubelet包,这将防止它们被自动安装、升级或删除。这是一个预防措施

#apt-mark hold kubectl kubelet

5. 取消保留的kubeadm包,升级kubeadm然后继续执行保留(hold)。可能会出现kubeadm 包已经被取消保留。

#apt-mark unhold kubeadm
#apt-get install kubeadm=1.23.1–00
#apt-mark hold kubeadm

6. 检查 kubeadm 版本以确保它已升级。

#kubeadm version

7. 查看kubeadm升级计划,看看还有哪些组件需要升级。

#kubeadm upgrade plan

8. 应用计划,接着你应该可以看到升级成功的信息。

#kubeadm upgrade apply v1.23.1

9. 取消保留 kubectl 和 kubelet 包,升级它们然后再次hold它们

请注意,如果你要复制此内容,您可能需要删除“-”并在终端中再次输入,因为它可能被视为拼写错误。

#apt-mark unhold kubelet kubectl
#apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00
#apt-mark unhold kubelet kubectl

10. 重新启动 kubelet并检查进程状态,它应该处于活动且正在运行状态。

#systemctl restart kubelet
#systemctl status kubelet

11. 运行 kubeadm upgrade plan 来检查确保一切都已升级。

#kubeadm upgrade plan

12. 检查节点状态和主节点的新版本

#kubectl get nodes

NAME       STATUS                    ROLES                   VERSION
master     Ready,SchedulingDisabled  control-plane,master    v1.23.1
worker     Ready                     <none>                  v1.22.2

13. 解封主节点,使其再次可调度

#kubectl uncordon master
#kubectl get nodes

NAME       STATUS    ROLES                  VERSION
master     Ready     control-plane,master   v1.23.1
worker     Ready     <none>                 v1.22.2

到这里我们完成了主节点,让我们移动到worker节点

@worker node:我们将重复使用以下相同的命令

工作节点升级步骤

1. 排空工作节点。你可能需要使用“force”参数来强制驱逐一些pod。

#kubectl drain worker --ignore-daemonsets --force
node/cks-worker drained

2. 更新包管理器。取消保留kubeadm,安装然后保留kubeadm。

#apt-get update
#apt-mark unhold kubeadm
#apt-get install kubeadm=1.23.1-00
#apt-mark hold kubeadm

3. 取消保留,安装,然后保留 kubectl 和 kubeadm。

#apt-mark unhold kubelet kubectl
#apt-get install kubelet=1.23.1-00 kubectl=1.23.1-00
#apt-mark unhold kubelet kubectl

4.重启kubelet进程并检查其状态

#systemctl restart kubelet
#systemctl status kubelet

5. 检查节点状态

#kubectl get nodes
NAME STATUS ROLES VERSION
master Ready control-plane,master v1.23.1
worker Ready,SchedulingDisabled <none> v1.23.1

6. 解封worker节点,使其再次可调度

#kubectl uncordon worker
#kubectl get nodes

NAME       STATUS    ROLES                  VERSION
master     Ready     control-plane,master   v1.23.1
worker     Ready     <none>                 v1.23.1

至此升级成功!!好好享受 :)

总结

  • 我们将 Kubernetes 集群版本从 1.22.2 升级到 1.23.1。
  • Kubeadm 包升级到 1.23.1 版本,然后使用 kubeadm 计划升级集群的其他组件。
  • Kubectl 和 Kubelet 升级到同一个版本 1.23.1。
  • 通常,我们排空节点,取消保留包,升级它然后再次保留它,最后解封节点。

原文:https://blog.devgenius.io/kubernetes-upgrade-the-hard-way-be2c75bb9b8f

Python使用os.fork()创建子进程

导入os模块

首先要导入os模块,如下:

import os

使用os.fork()创建进程

使用fork创建一个新的进程后,新进程是原进程的子进程,原进程为父进程。如果发生错误,则会抛出OSError异常。

-*- coding: utf-8 -*-
import time
import os
try:
pid = os.fork()
except OSError:
pass
time.sleep(20)

os.fork()会发生以下事情:

子进程会复制父进程的数据,包括父进程数据空间、堆、栈等资源。需要注意的是,子进程持有的是上述存储空间的“副本”,父子进程间不共享存储空间,它们之间共享的只有代码段。

接着父子进程继续并行运行后面的代码,这也是fork(分叉)名字的含义。在子进程内,这个方法会返回0;在父进程内,这个方法会返回子进程的编号PID。这样就可以实现父子进程并发处理。

示例:通过processId区分父子进程

# -*- coding: utf-8 -*-
import time
import os
#创建子进程前声明的变量
number = 7
try:
    pid = os.fork()
    if pid == 0:
        print("this is child process")
        number = number - 1
        time.sleep(5)
        print(number)
    else:
        print("this is parent process")
except OSError:
    pass


Python移除列表里重复的数据,并保留原来的次序

这有好几种方法实现。

使用set实现

def unique_everseen(items):
seen = set()
seen_add = seen.add
return [x for x in items if not (x in seen or seen_add(x))]

函数里把seen.add赋值给seen_add本地变量是出于性能考虑,因为seen会动态变化,如果直接在迭代里调用它会导致python每次都需要对它做检查。

more_itertools内置的unique_everseen函数

安装more_itertools

pip install more_itertools

使用

>>> from  more_itertools import unique_everseen
>>> items = [1, 2, 0, 1, 3, 2]
>>> list(unique_everseen(items))
[1, 2, 0, 3]

OrderedDict

>>> from collections import OrderedDict
>>> items = [1, 2, 0, 1, 3, 2]
>>> list(OrderedDict.fromkeys(items))
[1, 2, 0, 3]

Python 3.5拼接列表的新语法

在Python 3.5之前的版本,拼接列表可以有这两种方法:

1、列表相加

list1 = [1,2,3]
list2 = [4,5,6]
result = list1 + list2

结果为一个新的列表

2、在原来列表上扩展

list1 = [1,2,3]
list2 = [4,5,6]
list1.extend(list2)

list1扩展后,结果为[1,2,3,4,5,6]

3、新语法

如果列表是由range()生成:

list1 = [1,2,3]
list2 = range(4,6)
result = list1+list2

那么列表直接相加会报错:

TypeError: can only concatenate list (not 'range') to list

新语法为Python3.5+

list1 = [1,2,3]
list2 = range(4,6)
result = [*list1,*list2]

这种语法称为Additional Unpacking Generalizations,在列表前加上星号*,表示解包列表。

Scrapy的安装:ImportError: No module named '_cffi_backend'

Scrapy安装时报错:

ImportError: No module named '_cffi_backend'

这个原因是没有安装cffi包。使用pip3安装cryptography和cffi。

pip3 install cryptography
pip3 install cffi

Python批量升级更新库包(pip和Anaconda)

pip批量更新库

查看过期的库

pip list --outdated 

更新单一的库:

pip install --upgrade 库名

批量升级更新所有过期的库

import pip
from subprocess import call
for dist in pip.get_installed_distributions():
    call("pip install --upgrade " + dist.project_name, shell=True)

Anaconda批量更新库

 更新所有的库

conda update -all

更新Anaconda

conda update conda

Python Pandas使用正则过滤dataframe里的列

Python Pandas可以在DataFrame.filter方法里使用正则来过滤列:

创建DataFrame

import pandas as pd

df = pd.DataFrame(np.array([[1,2,3],[2,3,4],[3,4,5]]),columns=['a','d1','d2'])
>>
   a  d1  d2
0  1  2   3
1  2  3   4
2  3  4   5

filter

filter使用正则过滤以“d”开头的列

df.filter(regex=("d.*"))
>>
   d1  d2
0  2   3
1  3   4
2  4   5

select

除了使用filter的正则外,也可以使用select来选择以“d”开头的列:

df.select(lambda col: col.startswith('d'), axis=1)
>>
   d1  d2
0  2   3
1  3   4
2  4   5