İçeriğe geç
academia.sh

Ders 05 / 09

Konteyner Çalışma Zamanı

Yaygın altı düzenekli demet 12, sıkı sekiz düzenekli demet 10 olgu bırakıyor: iki düzenek eklemek yüzeyi yalnız 2 olgu daraltıyor ve açık eksen dördüncü düzenekten sonra 7'de duruyor.

İçindekiler

Dört ders dört düzenek ailesini tek tek ölçtü: ad alanı görünürlüğü, denetim grubu tüketimi, yetenek kırpma ayrıcalığı, zorunlu etiket erişimi daralttı. Her biri kendi ekseninde bir şey açık bıraktı ve her birinin yanına bir daraltma yolu yazıldı. Gerçek bir sistemde ise bu düzenekler tek tek açılmaz. Bir program bir tanım dosyası okur, dosyada yazan bütün düzenekleri doğru sırayla uygular ve süreci başlatır. O programın adı konteyner çalışma zamanıdır.

Bu ders çalışma zamanını bir düzenek demeti olarak ele alır ve tek soruyu sorar: düzenek eklemek yüzeyi ne kadar daraltıyor. Konteyner imajı, katman modeli, yerleşim, ölçekleme ve orkestrasyon DevOps müfredatının Konteynerler ve Konteyner Orkestrasyonu kurslarında ölçüldü; tekrarlanmaz. Buradaki konu yalnız çekirdeğin sunduğu parçalar ve bir çalışma zamanının onları nasıl bir araya getirdiğidir.

Çalışma Zamanı Ne Yapar

Çalışma zamanı bir dizin ile bir tanım dosyasından oluşan demeti girdi alır. Dizin sürecin kök dosya ağacıdır; tanım dosyası hangi düzeneklerin hangi ayarlarla açılacağını yazar. Çalışma zamanı bu dosyayı yorumlar, çekirdek çağrılarına çevirir ve süreci başlatır. Yaptığı iş bundan ibarettir: yeni bir izolasyon türü icat etmez, var olanları sırayla uygular.

# ornek calisma zamani tanimi (kisaltilmis , alan adlari ornektir)
# — calistirilmamistir
surec:
  komut: /usr/local/bin/olcum-toplayici
  kimlik: 10001
  yetenek-tavani: [CAP_NET_BIND_SERVICE]
  yeni-ayricalik-yok: evet
  erisim-etiketi: sistem_u:sistem_r:olcum_t:s0
kok:
  yol: kok-agaci
  salt-okunur: evet
takmalar:
  - hedef: /veri/olcum
    secenekler: [rw, nosuid, nodev, noexec]
ad-alanlari: [surec, takma, ag, makine, kullanici, iletisim, denetim-grubu]
kimlik-eslemesi:
  - icerideki: 0
    disaridaki: 100000
    boy: 65536
denetim-grubu:
  yol: /olcum.slice/olcum-toplayici
  islemci-kotasi: 20000/100000
  bellek-tavani: 536870912

Tanımdaki her satır önceki dört dersten birine karşılık geliyor. Alan adları belirtime göre değişir ve döküm çalıştırılmamıştır; buradan hiçbir sayı iddiası çıkmaz.

Sıra bağlayıcıdır ve yanlış sıra sessiz bir açık bırakır. Kullanıcı ad alanı en başta açılır, çünkü yetkisiz bir kullanıcının öteki türleri açabilmesini sağlayan tek tür odur ve kimlik eşlemesi kapanmadan yazılmalıdır. Denetim grubu süreç başlatılmadan önce hazırlanır, yoksa ilk saniyeler sınırsız geçer. Kök ağacı, süreç kendi takma ad alanına geçtikten sonra değiştirilir; önce değiştirilirse makinenin takma listesi kirlenir. Yetenek kırpma ile yeni ayrıcalık yok bayrağı ise en sona, program değiştirmeden hemen öncesine bırakılır; erken yapılırsa hazırlık adımları başarısız olur, geç yapılırsa kırpma hiç uygulanmaz.

# ornek dokum — calistirilmamistir
$ calisma-zamani create olcum-01 --bundle ./demet
$ calisma-zamani start  olcum-01
$ calisma-zamani state  olcum-01
$ calisma-zamani kill   olcum-01 TERM
$ calisma-zamani delete olcum-01

Yaşam döngüsü beş adımdır ve oluşturma ile başlatma ayrıdır. Oluşturma bütün düzenekleri kurar ve süreci başlatmadan bekletir; başlatma yalnız beklemeyi sonlandırır. Ayrımın nedeni işletmedir: bütün izolasyon kurulduktan sonra, süreç henüz tek bir komut çalıştırmadan yapılandırmanın doğrulanmasına imkân verir.

Çalışma zamanının kendisi de bir süreçtir ve düzenekleri kurabilmek için yetkiye ihtiyaç duyar. İki işletim biçimi vardır. Yetkili biçimde çalışma zamanı ayrıcalıklı bir hizmet olarak koşar, bütün düzenekleri doğrudan açar ve kurduğu izolasyonun dışında kalır. Yetkisiz biçimde ise zincir kullanıcı ad alanıyla başlar: çalışma zamanı önce bir kullanıcı ad alanı açar, kimlik eşlemesini yazar ve öteki düzenekleri o ad alanının içinden kurar. İkinci biçim bu kursun ölçüsünde ek bir olgu kapatmaz, ama bir kusur durumunda etkinin kapsamını daraltır — çünkü çalışma zamanının kendi yetkileri de eşlemenin sınırındadır.

Demetin dışında kalan bir sınır da açıkça yazılmalıdır. Bütün bu düzenekler tek bir çekirdeği paylaşır; çalışma zamanı süreçleri birbirinden ayırır, çekirdeği çoğaltmaz. Ayrı bir çekirdek isteniyorsa gereken şey başka bir teknoloji sınıfıdır ve bu kursun konusu değildir. Ölçünün son bölümünde çekirdek ekseninin neden kapanmadığı da tam bu paylaşımdan gelir.

İki Demet

  • IZ31Yaygın demet altı düzenektir: süreç, takma, ağ ve makine ad alanları, denetim grubu, yetenek kırpma. Kullanıcı ad alanı ve zorunlu etiket bu demette yoktur.
  • IZ32Sıkı demet sekiz düzenektir: yaygın demete kullanıcı ad alanı ve zorunlu etiket eklenir.
  • IZ33 — Demetler yalnız düzenek listesi bakımından farklıdır; olgu kümesi, eksenler ve açık kalan olgular ortak tanımdakiyle aynıdır.
  • IZ34 — Model sekiz düzenek sayar. Gerçek bir çalışma zamanının uyguladığı sistem çağrısı süzgeci ve süreç dosya sisteminin bazı yollarını maskeleme adımı modelde düzenek olarak sayılmaz; ikisi de aşağıda daraltma yolu olarak yazılır.
"""Ortak tanim: izolasyon bir suzgectir. Bir konteyner calisma zamani
duzeneklerin bir DEMETIDIR. Olculen sey ACIK KALAN YUZEY."""

OLGULAR = [
    ("oteki-sureclerin-listesi", "surec"), ("kendi-surec-numarasi", "surec"),
    ("ata-surec-zinciri", "surec"),
    ("kok-dosya-agaci", "takma"), ("oteki-takmalar", "takma"),
    ("paylasilan-gecici-dizin", "takma"),
    ("makine-arayuzleri", "ag"), ("makine-yonlendirme-tablosu", "ag"),
    ("dinleyen-baglanti-noktalari", "ag"),
    ("kullanici-kimlik-esleme", "kullanici"), ("dosya-sahipligi", "kullanici"),
    ("makine-adi", "makine"),
    ("islemci-payi", "kaynak"), ("bellek-siniri", "kaynak"),
    ("kullanilan-bellek", "kaynak"), ("islemci-sayisi", "kaynak"),
    ("cekirdek-surumu", "cekirdek"), ("cekirdek-ayarlari", "cekirdek"),
    ("sistem-yuku", "cekirdek"), ("saat", "cekirdek"),
    ("yetenek-kumesi", "yetki"), ("dosya-yetkileri", "yetki"),
    ("erisim-etiketi", "etiket"), ("politika-kurallari", "etiket"),
]
DUZENEK = {
    "surec-ad-alani":     {"eksen": "surec", "acik_kalan": ["kendi-surec-numarasi"]},
    "takma-ad-alani":     {"eksen": "takma", "acik_kalan": ["kok-dosya-agaci"]},
    "ag-ad-alani":        {"eksen": "ag", "acik_kalan": []},
    "kullanici-ad-alani": {"eksen": "kullanici", "acik_kalan": ["dosya-sahipligi"]},
    "makine-ad-alani":    {"eksen": "makine", "acik_kalan": []},
    "denetim-grubu":      {"eksen": "kaynak", "acik_kalan": ["islemci-sayisi"]},
    "yetenek-kirpma":       {"eksen": "yetki", "acik_kalan": ["dosya-yetkileri"]},
    "zorunlu-etiket":     {"eksen": "etiket", "acik_kalan": ["erisim-etiketi"]},
}
YAYGIN = ["surec-ad-alani", "takma-ad-alani", "ag-ad-alani",
          "makine-ad-alani", "denetim-grubu", "yetenek-kirpma"]
SIKI = YAYGIN + ["kullanici-ad-alani", "zorunlu-etiket"]


def gorunen(duzenekler, olgular=None):
    olgular = OLGULAR if olgular is None else olgular
    kapali = set()
    for d in duzenekler:
        v = DUZENEK[d]
        kapali |= {o for o, e in olgular if e == v["eksen"]}
        kapali -= set(v["acik_kalan"])
    return [o for o, _ in olgular if o not in kapali]


def acik_eksen(duzenekler, olgular=None):
    olgular = OLGULAR if olgular is None else olgular
    g = set(gorunen(duzenekler, olgular))
    return sorted({e for o, e in olgular if o in g})


print("KAHIN  olgu:", len(OLGULAR), "| eksen:", len({e for _, e in OLGULAR}))
print()
print("demet     duzenek  kapatti  gorunen  acik eksen")
for ad, d in (("yalin", []), ("yaygin", YAYGIN), ("siki", SIKI)):
    g = gorunen(d)
    print(f"  {ad:8s} {len(d):7d}  {len(OLGULAR) - len(g):7d}"
          f"  {len(g):7d}  {len(acik_eksen(d)):10d}")
print()
print("iki demetin farki:", [d for d in SIKI if d not in YAYGIN])
print("fark ettigi olgu :", sorted(set(gorunen(YAYGIN)) - set(gorunen(SIKI))))
print("iki duzenek yuzeyi", len(gorunen(YAYGIN)) - len(gorunen(SIKI)),
      "olgu daraltiyor")
KAHIN  olgu: 24 | eksen: 9

demet     duzenek  kapatti  gorunen  acik eksen
  yalin          0        0       24           9
  yaygin         6       12       12           7
  siki           8       14       10           7

iki demetin farki: ['kullanici-ad-alani', 'zorunlu-etiket']
fark ettigi olgu : ['kullanici-kimlik-esleme', 'politika-kurallari']
iki duzenek yuzeyi 2 olgu daraltiyor

Üç sayı yan yana duruyor. Kâhin: 24 olgu, 9 eksen. İzolasyon: yaygın demet 12 olgu, sıkı demet 14 olgu kapatıyor. Açık kalan yüzey: yaygın demette 12 olgu, sıkı demette 10 olgu; ikisinde de 7 eksen.

Bu, kursun ikinci iddiasının en güçlü ödemesidir. Yaygın demetten sıkı demete geçmek düzenek sayısını üçte bir büyütüyor, iki ayrı mekanizma ekliyor, yapılandırmayı ve işletim yükünü belirgin biçimde artırıyor — ve yüzeyi yalnız 2 olgu daraltıyor. Daralan olgular kullanici-kimlik-esleme ile politika-kurallaridır. Açık eksen ise hiç değişmiyor.

Sonuç, iki düzeneğin değersiz olduğu anlamına gelmez ve öyle okunmamalıdır. Kullanıcı ad alanı kimlik eşlemesini kapatarak yetkilerin kapsamını daraltır; zorunlu etiket, önceki derste sayıldığı gibi 36 erişim çiftinden 28’ini politikaya bağlar. Ölçü bunları saymıyor; ölçü yalnız görünürlüğü sayıyor. Söylediği şey dar ve nettir: görünürlük tarafında ikisinin kazancı iki olgudur.

Ölçünün pratikteki kullanımı da buradan çıkar. Bir demeti sıkılaştırmaya karar verirken sorulacak soru “kaç düzenek açtım” değil, “hangi olgu hâlâ görünüyor” olmalıdır. Birinci soru yapılandırmanın uzunluğunu ödüllendirir; ikincisi, kazancın nerede bittiğini gösterir. İki demetin arasındaki fark yazıya döküldüğünde yalnız iki satırdır ve bu iki satır, sıkılaştırmanın maliyetiyle birlikte tartılabilir hâle gelir.

Düzenek Eklendikçe

Demetleri uçtan uca karşılaştırmak, kazancın nerede biriktiğini göstermez. Aynı sıkı demet düzenek düzenek kurulduğunda eğri okunabilir hâle gelir.

  • IZ35 — Ekleme sırası sıkı demetin listesindeki sıradır.
  • IZ36 — Süpürmede eklenen olgu cekirdek-derleme-secenekleri, çekirdek eksenine aittir; çıkarılan saat de aynı eksendedir.
# --- Onceki blogun uzerine kurulur: OLGULAR, DUZENEK, YAYGIN, SIKI,
# gorunen ve acik_eksen oradan gelir.
print("duzenek eklendikce (siki demet sirasiyla)")
for i in range(len(SIKI) + 1):
    ekle = SIKI[i - 1] if i else "-"
    print(f"  {i} duzenek ({ekle:18s}) gorunen {len(gorunen(SIKI[:i])):2d}"
          f"  acik eksen {len(acik_eksen(SIKI[:i]))}")
print()
g = set(gorunen(SIKI))
print("siki demetten sonra acik kalan", len(g), "olgu (eksene gore)")
for e in acik_eksen(SIKI):
    o = [x for x, ek in OLGULAR if ek == e and x in g]
    print(f"  {e:10s} {len(o)}  {', '.join(o)}")
print()
EK = OLGULAR + [("cekirdek-derleme-secenekleri", "cekirdek")]
EKSIK = [(o, e) for o, e in OLGULAR if o != "saat"]
print("olgu kumesi supurmesi (siki demet uygulanmis halde)")
print("kume                            olgu  eksen  gorunen  acik eksen")
for ad, kume in (("temel", OLGULAR), ("+cekirdek-derleme-secenekleri", EK),
                 ("-saat", EKSIK)):
    print(f"  {ad:29s} {len(kume):4d}  {len({x for _, x in kume}):5d}"
          f"  {len(gorunen(SIKI, kume)):7d}  {len(acik_eksen(SIKI, kume)):10d}")
duzenek eklendikce (siki demet sirasiyla)
  0 duzenek (-                 ) gorunen 24  acik eksen 9
  1 duzenek (surec-ad-alani    ) gorunen 22  acik eksen 9
  2 duzenek (takma-ad-alani    ) gorunen 20  acik eksen 9
  3 duzenek (ag-ad-alani       ) gorunen 17  acik eksen 8
  4 duzenek (makine-ad-alani   ) gorunen 16  acik eksen 7
  5 duzenek (denetim-grubu     ) gorunen 13  acik eksen 7
  6 duzenek (yetenek-kirpma    ) gorunen 12  acik eksen 7
  7 duzenek (kullanici-ad-alani) gorunen 11  acik eksen 7
  8 duzenek (zorunlu-etiket    ) gorunen 10  acik eksen 7

siki demetten sonra acik kalan 10 olgu (eksene gore)
  cekirdek   4  cekirdek-surumu, cekirdek-ayarlari, sistem-yuku, saat
  etiket     1  erisim-etiketi
  kaynak     1  islemci-sayisi
  kullanici  1  dosya-sahipligi
  surec      1  kendi-surec-numarasi
  takma      1  kok-dosya-agaci
  yetki      1  dosya-yetkileri

olgu kumesi supurmesi (siki demet uygulanmis halde)
kume                            olgu  eksen  gorunen  acik eksen
  temel                           24      9       10           7
  +cekirdek-derleme-secenekleri   25      9       11           7
  -saat                           23      9        9           7

Eğrinin biçimi tek başına bir sonuçtur. İlk dört düzenek görünen olguyu 24’ten 16’ya indiriyor: sekiz olgu. Son dört düzenek 16’dan 10’a indiriyor: altı olgu. Açık eksen ise dördüncü düzenekten sonra bir daha hiç değişmiyor — beşinciden sekizinciye kadar dört düzenek eklendi ve eksen sayısı 7’de kaldı.

Nedeni son tabloda yazıyor. Sıkı demetten sonra açık kalan 10 olgunun yedisi, yedi ayrı eksende birer tanedir. Her düzenek kendi ekseninde bir olguyu açık bıraktığı için, o eksen listeden hiçbir zaman düşmez. Yedi eksende her zaman bir şey açık kalıyor ve bu, düzenek eklemekle kapanmıyor. Kursun ikinci iddiası tam olarak budur: düzenek eklemek olguyu azaltır ama ekseni azaltmaz.

Süpürme aynı yapıyı doğruluyor ve önceki derslerden farklı bir sonuç veriyor. Çekirdek eksenine yirmi beşinci olgu eklendiğinde yüzey 10’dan 11’e çıkıyor: ekleme birebir yüzeye yansıyor. Bir olgu çıkarıldığında yüzey 9’a iniyor, ama açık eksen 7’de kalıyor. Fark nereden geliyor — önceki derslerde eklenen olgu kapatılmış bir eksene düşüyordu ve düzenek onu da kapatıyordu; burada eksen kapatılmamıştır.

Kapanmayan Eksen: Çekirdek

Açık kalan 10 olgunun dördü tek bir eksende toplanıyor ve o eksenin adı çekirdektir: çekirdek sürümü, çekirdek ayarları, sistem yükü ve saat. Bunlar sıkı demetteki açık yüzeyin en büyük tek bloğudur ve nedeni modelin bir eksikliği değildir — çekirdek eksenini kapatan hiçbir düzenek yoktur. Ad alanı ikinci bir çekirdek üretmez; makinede tek bir çekirdek vardır ve her süreç onunla konuşur. Bu, izolasyonun en temel sınırıdır ve yapılandırmayla aşılmaz.

Buna karşılık eksen daraltılabilir ve üç yol vardır. Birincisi, çekirdek bilgisini yayınlayan yolların maskelenmesi ya da salt okunur yapılmasıdır: sürecin kök ağacında bu yollar ya hiç görünmez ya da yazılamaz. Bir çalışma zamanının öntanımlı olarak yaptığı iş budur ve modelde düzenek olarak sayılmayan adımlardan biridir. İkincisi, ad alanına göre ayrılabilen çekirdek ayarlarının ayrı ayrı verilmesidir; ayarların hepsi ayrılamaz, ama ayrılabilenler makinenin değerini göstermeyi bırakır. Üçüncüsü, sürecin çekirdeğe yapabileceği çağrı kümesini bir sistem çağrısı süzgeciyle daraltmaktır: süzgeç bir olguyu görünmez kılmaz, ama görünen olgunun karşılığı olan işlemleri azaltır. Üçü de yüzeyi sıfırlamaz; ölçünün dürüst okuması şudur: bu eksende bir şey her zaman görülecektir ve tasarım buna göre yapılır.

Kalan altı olgu için daraltma yolları önceki derslerde yazıldı: kök ağacını küçültmek ve salt okunur takmak, kotayı okuyup havuz boyutlandırmasını ona bağlamak, sahiplik bayraklarını temizlemek ve dosya sistemini nosuid ile takmak, sahipliği eşlenen aralığa normalleştirmek, erişim etiketini gizli bilgi taşımayacak biçimde adlandırmak. Beşi de aynı kalıptadır: açık kalan olgu süreçte değil, sürecin dünyasında daraltılır.

Özet

  • Konteyner çalışma zamanı yeni bir izolasyon türü icat etmez; bir tanım dosyasındaki düzenekleri doğru sırayla uygulayan bir programdır. Sıra bağlayıcıdır ve yanlış sıra sessiz bir açık bırakır.
  • Yaygın altı düzenekli demet 12 olgu, sıkı sekiz düzenekli demet 10 olgu açık bırakır: iki düzenek eklemek yüzeyi yalnız 2 olgu daraltır ve daralan olgular kullanici-kimlik-esleme ile politika-kurallaridır.
  • Açık eksen dördüncü düzenekten sonra 7’de durur ve dört düzenek daha eklendiğinde hiç değişmez; düzenek eklemek olguyu azaltır, ekseni azaltmaz.
  • Sıkı demetten sonra açık kalan 10 olgunun yedisi yedi ayrı eksende birer tanedir; kalan dördü çekirdek eksenindedir ve bu ekseni kapatan hiçbir düzenek yoktur.
  • Çekirdek ekseni kapatılamaz ama daraltılır: bilgi yayan yolların maskelenmesi, ad alanına ayrılabilen ayarların ayrı verilmesi ve sistem çağrısı süzgeci. Modeldeki bütün sayılar kurgu üzerinden tam sayımdır, ölçüm değildir.

Sonraki Adım

Bu konu izolasyonun kapatabildiğini ve kapatamadığını saydı; sıkı demet 24 olgunun 14’ünü kapattı, 10’unu açık bıraktı. Kapanan 14 olgunun gerçekten kapandığı ise henüz sınanmadı. Kursun ikinci konusu tam bu soruyu sorar ve yanıtı birinci konunun tersi yöndedir: bir sürecin çekirdekle konuşmasını okuyan, işlemci kullanımını örnekleyen, çekirdek içinde olay yakalayan ve çöken sürecin ardından dökümüne bakan araçlar, izolasyonun kapattığı olguların bir kısmını geri getirir. Sonraki ders bunların ilkini, sistem çağrısı izlemeyi ölçer: kaç olgunun geri geldiğini ve koşuma eklediği bedeli sayar. Kursun iki konusu birbirinin karşıtıdır ve bu açıkça yazılır — gözlem izolasyonu deler.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat